C# 基于Linq中的特定属性读取特定元素值?

C# 基于Linq中的特定属性读取特定元素值?,c#,linq,C#,Linq,我只是在学习Linq,并且坚持我所希望的相当简单。我的xml文档如下所示: <?xml version="1.0" encoding="utf-8"?> <XDOC> ... <ItemsDetail> <Item name="Item1"> <data1> <Data type="classA">55</Data>

我只是在学习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>
然后对查询运行一个
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发表评论,它不是我的,我只需要处理它。

我想你是想得到值55?您可以使用该方法查找第一个“数据”元素,其“type”属性值为“classA”

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

这是有效的,与我刚才看到的类似,尽管没有看到第一个。有没有更推荐的方法来处理这样一个xml文档?如果您能够获得一个描述文档的XSD(xml模式文档),那么我肯定会考虑生成真正的类和使用标准的xml序列化。
record.Element("data1")
      .Elements("Data")
      .First(data => data.Attribute("type").Value == "classA")
      .Value
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);
}