获取每个 xml 节点的 XmlNode 值

Getting the XmlNode value for each xml node

我正在使用下面的 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<bookstore xmlns="urn:newbooks-schema">  
  <book>
    <title>Books</title>
    <price>20.00</price>
  <attribute>
      <fieldName>Books</fieldName>
      <attributeStyle>ValueSet</attributeStyle>
      <valueset>
        <id>Part 1</id>
        <values>
          <displayName>Lord of the Rings</displayName>
        </values>
      </valueset>
    </attribute>
  </book>  
  
  <book>
    <title>Books</title>
    <price>20.00</price>
    <attribute>
      <fieldName>Books</fieldName>
      <valueset>
        <id>Part 1</id>
        <values>
          <displayName>Harry Potter</displayName>
        </values>
      </valueset>
    </attribute>
  </book>
</bookstore>

我正在尝试获取 XMLNodeList 中的每个节点“book”,并且正在循环节点以获取节点“values”的各个数据。我使用了下面的代码并试图实现它但是 valuenodes 总是同时返回两个值节点,即指环王和哈利波特一起而不是在每个循环中。我想一个一个循环实现,而不是一起实现。

        var xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(text);
        var root = xmlDocument.DocumentElement;

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
        nsmgr.AddNamespace("bk", "urn:newbooks-schema");

        XmlNodeList criterion = root.SelectNodes("bk:book[bk:title='Books']", nsmgr);

        foreach (XmlNode criterionNode in criterion)
        {
            XmlNode xml = criterionNode.SelectSingleNode("//bk:valueset", nsmgr);
            var valuesNodeExpression = "//bk:valueset/bk:values[../../bk:fieldName='Books']";
            XmlNodeList valueNodes = criterionNode.SelectNodes(valuesNodeExpression, nsmgr);
        }

我稍微重构了代码,为变量提供了更能说明问题的名称。

// Here the previous code is unchanged.

var books = root.SelectNodes("bk:book[bk:title='Books']", nsmgr);
Console.WriteLine(books.Count);

foreach (XmlNode book in books)
{
    var valueset = book.SelectSingleNode(".//bk:valueset", nsmgr);
    var id = valueset.SelectSingleNode("./bk:id", nsmgr).InnerText;
    var displayName = valueset.SelectSingleNode(".//bk:displayName", nsmgr).InnerText;

    Console.WriteLine(id);
    Console.WriteLine(displayName);
}