代码之家  ›  专栏  ›  技术社区  ›  Coding Monkey

是否基于LINQ中的特定属性读取特定元素值?

  •  0
  • Coding Monkey  · 技术社区  · 15 年前

    我只是在学习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 回复  |  直到 15 年前
        1
  •  2
  •   Nathan Baulch    15 年前

    我想你是想得到55的价值?你可以使用 First 方法查找第一个“data”元素,其“type”属性值为“classa”。

    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);
    }