获取每个 xml 节点的 XmlNode 值

Posted

技术标签:

【中文标题】获取每个 xml 节点的 XmlNode 值【英文标题】:Getting the XmlNode value for each xml node 【发布时间】: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);
        

【问题讨论】:

请标记一种语言。 【参考方案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);

【讨论】:

以上是关于获取每个 xml 节点的 XmlNode 值的主要内容,如果未能解决你的问题,请参考以下文章

通过当前节点的 xmlnode 属性之一获取值

Groovy自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )

怎样获取xml中当前节点的直接孩子节点个数

c# .net 怎么将一个xml字符串 转换成一个xmlnode ,(不是xmldocument)

C# 解析XML文件,使用XmlNode["..."]的方式能访问到此节点下的多个同名节点吗?

XMLNODE:如何在我的 xml 中选择具有属性的此节点