2

我正在尝试使用 C# 和 LINQ XML 读取 XML 文件中的属性,但无法检索深度嵌套在树中的值。我试图获得的价值是<Value>near的内容<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 ("---");
    }
  }
}
4

1 回答 1

4

您可以使用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
于 2013-09-24T16:39:18.363 回答