C# 基于Linq中的特定属性读取特定元素值?
我只是在学习Linq,并且坚持我所希望的相当简单。我的xml文档如下所示: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>
<?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);
}