我只是在学习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,这不是我的,我只需要使用它。
答案 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);
}