根据Linq中的特定属性读取特定的元素值?

时间:2009-08-24 01:39:53

标签: c# linq

我只是在学习Linq,并坚持我希望相当简单。我的xml文档就像:

<?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,这不是我的,我只需要使用它。

1 个答案:

答案 0 :(得分:2)

我认为你试图获得55的价值?您可以使用First方法查找“type”属性值为“classA”的第一个“Data”元素。

record.Element("data1")
      .Elements("Data")
      .First(data => data.Attribute("type").Value == "classA")
      .Value

请注意,上述解决方案非常脆弱。对输入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);
}