2009-08-24 82 views
0

我刚刚学习Linq,并坚持我希望的相当简单。我的xml文档是这样的:根据Linq中的特定属性读取特定的元素值?

<?xml version="1.0" encoding="utf-8"?> 
<XDOC> 
    ... 
    <ItemsDetail> 
     <Item name="Item1"> 
      <data1> 
       <Data type="classA">55</Data> 
       <Data type="classB">66</Data> 
      </data1> 
      <data2> 
       <Data type="classA">77</Data> 
       <Data type="classB">88</Data> 
      </data2> 
     </Item> 
    </ItemsDetail> 
</XDOC> 

所以我打开我的XML以上为XDocument类型,然后查询

var query = from p in ILSXml.Elements("XDOC").Elements("ItemsDetail").Elements("Item") 
      select p; 

然后我上查询运行foreach

foreach (var record in query) 
{ 
    Console.WriteLine("Name: {0}", record.Attribute("Name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 
} 

因此该行:

Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 

不工作这,就是我是非常期待的。我是否必须运行另一系列查询或运行一些内联​​匿名方法?

哦,请不要评论xml,它不是我的,我只需要使用它。

回答

2

我假设你试图得到值55?您可以使用First方法查找“类型”属性值为“classA”的第一个“Data”元素。

​​

请注意,上述解决方案非常脆弱。对输入xml文档的结构进行的任何更改都可能会导致空引用异常。

您还可以使用更紧凑的XPath查询语言来查询XML文档。 XPath可以使用方括号中的简单表达式来过滤元素。然后你的代码如下所示:

foreach (var record in ILSXml.XPathSelectElements("XDOC/ItemsDetail/Item")) 
{ 
    Console.WriteLine("Name: {0}", 
     record.Attribute("name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", 
     record.XPathSelectElement("data1/Data[@type='classA']").Value); 
} 
+0

这很有效,类似于我刚才看到的,虽然错过了.First。 有没有更好的方法来处理这样的XML文档? – 2009-08-24 02:14:13

+0

如果您可以亲自使用描述文档的XSD(XML模式文档),那么我一定会考虑生成真正的类并使用标准的XML序列化。 – 2009-08-24 02:24:51

相关问题