我正在尝试使用C#和LINQ XML读取XML文件中的属性,但我无法检索深度嵌套在树中的值。我想要得到的值是<Value>
附近<DisplayName>Add Your Comments</DisplayName>
的内容。每个<OrderProduct id=???>
都可能有自己的评论。
我可以使用LINQ读取XML文件中的其他属性,但我很困惑如何阅读如此深入嵌套的内容。
感谢。
<?xml version="1.0" encoding="utf-16"?>
<OrderXml>
<Order>
<OrderProducts>
<OrderProduct id="1">
.
.
.
</OrderProduct>
<OrderProduct id="2">
<PropertyValues>
<PropertyValue>
<Property id="10786">
<DisplayName>Base</DisplayName>
</Property>
<Value />
</PropertyValue>
<PropertyValue>
<Property id="10846">
<DisplayName>Add Your Comments</DisplayName>
</Property>
<Value>this is a comment</Value>
</PropertyValue>
</PropertyValues>
</OrderProduct>
</OrderProducts>
</Order>
</OrderXml>
这是我到目前为止的代码。我可以检索“添加你的评论”部分,但我仍然坚持如何获得它后面的部分。
string productOrderID = "";
string productName = "";
XElement xelement;
xelement = XElement.Load (@"D:\Order.xml");
IEnumerable<XElement> Products = xelement.Descendants ("OrderProduct");
foreach (var order in Products)
{
productOrderID = order.Attribute ("id").Value;
productName = order.Element ("Product").Element ("Name").Value;
Console.WriteLine ("productOrderID: {0}", productOrderID);
Console.WriteLine ("productName: {0}", productName);
Console.WriteLine ("");
IEnumerable<XElement> PropertyValues = xelement.Descendants ("PropertyValues").Elements ("PropertyValue");
foreach (var propValue in PropertyValues.Elements ("Property").Elements ("DisplayName"))
{
Console.WriteLine ("Property ID: {0}", propValue.Value);
if (propValue.Value == "Add Your Comments")
{
Console.WriteLine ("---");
}
}
}
答案 0 :(得分:3)
您可以使用Descendants搜索文档中的节点,无论它们位于何处:
string name = "Add Your Comments";
var value = xdoc
.Descendants("PropertyValue")
.Where(pv => (string)pv.Element("Property").Element("DisplayName") == name)
.Select(pv => (string)pv.Element("Value"))
.FirstOrDefault();
输出:
this is a comment