【问题标题】:Getting the XmlNode value for each xml node获取每个 xml 节点的 XmlNode 值
【发布时间】:2020-11-28 02:05:44
【问题描述】:

我正在使用下面的 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 中获取每个节点“书”,并且我正在循环节点以获取节点“值”的各个数据。我已经使用了下面的代码并尝试实现它但是 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);
        }

【问题讨论】:

  • 请标记一种语言。

标签: c# xml xpath xmlnode xmlnodelist


【解决方案1】:

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

// 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2013-08-12
    • 2012-07-05
    相关资源
    最近更新 更多