从XML文档中获取特定数据

时间:2011-10-10 18:56:22

标签: c# xml

我有这样的xml文档:

<level1>
 <level2>
  <level3>
   <attribute1>...</attribute1>
   <attribute2>false</attribute2>
   <attribute3>...</attribute3>
  </level3>
  <level3>
   <attribute1>...</attribute1>
   <attribute2>true</attribute2>
   <attribute3>...</attribute3>
  </level3>
</level2>
<level2>
 <level3>
   <attribute1>...</attribute1>
   <attribute2>false</attribute2>
...
...
...

我正在使用c#,我想通过所有“level3”,并且对于每个“level3”,我想读取attribute2,如果它说“true”,我想打印相应的attribute3(可以是没有这些属性的“level3”。

我将xml保存在XmlDocument中。 然后我保留所有“level3”节点,如下所示:

XmlNodeList xnList = document.SelectNodes(String.Format("/level1/level2/level3"));

(文档是XmlDocument)。

但从现在开始,我不确切知道如何继续。我尝试使用for..each通过xnList,但对我来说没有什么工作正常..

我该怎么做?

非常感谢

3 个答案:

答案 0 :(得分:4)

我会使用LINQ to XML:

var results = from level3 in doc.Descendants("level3")
              where (bool) level3.Element("attribute2")
              select level3.Element("attribute3").Value;

foreach (string result in results)
{
    Console.WriteLine(result);
}

LINQ to XML使各种事情 XmlDocument API更简单。当然,缺点是它需要.NET 3.5 ......

(顺便说一下,命名元素 attributeN有点令人困惑......人们希望attribute能够引用实际的XML属性...)

答案 1 :(得分:0)

您可以使用LINQ to XML,阅读this是一个良好的开端。

答案 2 :(得分:0)

您可以使用XPath查询。这将为您提供XmlNodeList,其中包含符合您要求的所有<attribute3>元素:

var list = document.SelectNodes("//level3[attribute2 = 'true']/attribute3");

foreach(XmlNode node in list)
{
    Console.WriteLine(node.InnerText);
}

您可以将上述xpath查询分为三个部分:

  1. //level3”查询名为<level3>的所有后代元素。
  2. [attribute2 = 'true']”会过滤(1)的结果,并仅保留子元素<attribute2>包含文字true的元素。
  3. /attribute3”获取<attribute3>结果中每个元素的(2)子节点。