检索XML文件中的深层嵌套值

时间:2013-09-24 16:27:27

标签: c# xml linq

我正在尝试使用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 ("---");
    }
  }
}

1 个答案:

答案 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