当节点在集合中时,是否有办法获取节点的innertext 目前我有这个
Collection<string> DependentNodes = new Collection<string>();
foreach (XmlNode node in nodes)
{
for (int i = 0; i < node.ChildNodes.Count; i++)
{
DependentNodes.Add(node.ChildNodes[i].InnerXml);
//the reason i'm using InnerXml is that it will return all the child node of testfixture in one single line,then we can find the category & check if there's dependson
}
}
string selectedtestcase = "abc_somewords";
foreach (string s in DependentNodes)
{
if(s.Contains(selectedtestcase))
{
MessageBox.Show("aaa");
}
}
当我调试字符串s或索引中有这个[在一行]
<testfixture name="1" description="a">
<categories>
<category>abc_somewords</category>
</categories>
<test name="a" description="a">
<dependencies>
<dependson typename="dependsonthis" />
</dependencies>
</test>
</testfixture>
我想要做的是当我们到达“testfixture 1”时,它会找到“abc_somewords”&amp;搜索“dependson typename”节点(如果有)并获取“typename”(即“dependonthis”)。
答案 0 :(得分:3)
你能使用linq到xml吗?像下面这样的东西可能是一个不错的开始
xml.Elements("categories").Where(x => x.Element("category").Value.Contains(selectedtestcase));
这是我的头脑,所以可能需要提炼
P.S。使用XElement.Load或XElement.Parse将xml导入XElements
答案 1 :(得分:3)
由于您已经使用XmlNode
,因此可以使用XPath表达式选择所需的textfixture
节点,并选择依赖关系值:
XmlDocument doc = // ...
XmlNode node = doc.SelectSingleNode("//testfixture[contains(categories/category, \"abc\")]/test/dependencies/dependson/");
if (node != null)
{
MessageBox.Show(node.Attributes["typename"]);
}
这将选择属于dependson
节点的testfixture
节点,其中category
包含“abc”。 node.Attributes["typename"]
将返回typename
属性的值。
<强>编辑:强> 将XPath表达式更新为更具体的问题信息
答案 2 :(得分:3)
<强>假设强>
当你在代码中循环并希望创建一个集合时,我假设实际的Xml文件里面有几个testfixture
个节点,如下面假设的例子:
<root>
<testfixture name="1" description="a">
<categories>
<category>abc_somewords</category>
</categories>
<test name="a" description="a">
<dependencies>
<dependson typename="dependsonthis" />
</dependencies>
</test>
</testfixture>
<testfixture name="2" description="a">
<categories>
<category>another_value</category>
</categories>
<test name="b" description="a">
<dependencies>
<dependson typename="secondentry" />
</dependencies>
</test>
</testfixture>
<testfixture name="3" description="a">
<categories>
<category>abc_somewords</category>
</categories>
<test name="c" description="a">
<dependencies>
<dependson typename="thirdentry" />
</dependencies>
</test>
</testfixture>
</root>
使用Linq到Xml的代码
要使用Linq,您必须引用以下名称空间:
using System.Linq;
using System.Xml.Linq;
在上面假设的xml文件结构上使用Linq To Xml将如下所示:
// To Load Xml Content from File.
XDocument doc1 = XDocument.Load(@"C:\MyXml.xml");
Collection<string> DependentNodes = new Collection<string>();
var results =
doc1.Root.Elements("testfixture")
.Where(x => x.Element("categories").Element("category").Value.Contains("abc_somewords"))
.Elements("test").Elements("dependencies").Elements("dependson").Attributes("typename").ToArray();
foreach (XAttribute attribute in results)
{
DependentNodes.Add(attribute.Value.Trim());
}
<强>结果强>
生成的集合将包含以下内容:
正如您所看到的,只有typename
节点的文本被提取,其中dependson
节点位于testfixture
节点中,其中包含category
节点价值abc_somewords
。
附加说明
如果从字符串中读取xml,也可以使用:
// To Load Xml Content from a string.
XDocument doc = XDocument.Parse(myXml);
如果您的完整 Xml结构不同,请随意发布,然后更改代码以匹配。
玩得开心。
答案 3 :(得分:1)
我不知道你正在使用什么“节点”。
以下是符合您要求的代码(我理解的内容)。
Collection<XmlNode> DependentNodes = new Collection<XmlNode>();
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"Path_Of_Your_xml");
foreach (XmlNode node in xDoc.SelectNodes("testfixture")) // Here I am accessing only root node. Give Xpath if ur requrement is changed
{
for (int i = 0; i < node.ChildNodes.Count; i++)
{
DependentNodes.Add(node.ChildNodes[i]);
}
}
string selectedtestcase = "abc_somewords";
foreach (var s in DependentNodes)
{
if (s.InnerText.Contains(selectedtestcase))
{
Console.Write("aaa");
}
}
答案 4 :(得分:1)
using System;
using System.Xml;
namespace ConsoleApplication6
{
class Program
{
private const string XML = "<testfixture name=\"1\" description=\"a\">" +
"<categories>" +
"<category>abc_somewords</category>" +
"</categories>" +
"<test name=\"a\" description=\"a\">" +
"<dependencies>" +
"<dependson typename=\"dependsonthis\" />" +
"</dependencies>" +
"</test>" +
"</testfixture>";
static void Main(string[] args)
{
var document = new XmlDocument();
document.LoadXml(XML);
var testfixture = document.SelectSingleNode("//testfixture[@name = 1]");
var category = testfixture.SelectSingleNode(".//category[contains(text(), 'abc_somewords')]");
if(category != null)
{
var depends = testfixture.SelectSingleNode("//dependson");
Console.Out.WriteLine(depends.Attributes["typename"].Value);
}
Console.ReadKey();
}
}
}
输出:依赖于此