【问题标题】:Select single node选择单个节点
【发布时间】:2016-02-24 10:39:49
【问题描述】:

来自以下 xml:

<response>
    <content>
        <Result xmlns="http://www.test.com/nav/webservices/types">
            <Name>Test</Name>
        </Result>
    </content>
    <status>ok</status>
</response>

我正在尝试通过以下方式获取 Name 元素的值,但这不起作用:

private static void Main()
{
    var response = new XmlDocument();
    response.Load("Response.xml");
    var namespaceManager = new XmlNamespaceManager(response.NameTable);
    namespaceManager.AddNamespace("ns", "http://www.test.com/nav/webservices/types");

    Console.WriteLine(response.SelectSingleNode("/response/content/Result/Name", namespaceManager).InnerXml);
}

如何选择名称元素?

【问题讨论】:

  • 顺便说一句,在 2016 年,您应该使用 XDocument 和 Linq2Xml...

标签: c# xpath xmldocument


【解决方案1】:

如果 Xml 使用“ns:”前缀定义了命名空间,您的代码就可以正常工作。

但在这种情况下,命名空间没有任何前缀,这会将 Result 标记中所有内容的默认命名空间设置为“.../webservice/types”。

为了反映这一点,您需要修改 Xpath,并告诉 XmlDocument 您在 Result 下查找的节点位于 webservice/types 命名空间中。所以您的查询将如下所示:

Console.WriteLine(response.SelectSingleNode(@"/response/content/ns:Result/ns:Name", namespaceManager).InnerXml);

【讨论】:

    【解决方案2】:

    为了直接获取节点的文本值,有一个text() 函数,如果在查询中使用它看起来像:

    /response/content/Result/Name/text()
    

    【讨论】:

      【解决方案3】:

      试试这个:

      XmlDocument xmlDoc = new XmlDocument();
      xmlDoc.InnerXml = "<response><content><Result xmlns=\"http://www.test.com/nav/webservices/types\"><Name>Test</Name></Result></content><status>ok</status>";
      string elementValue = String.Empty;
      
      if (xmlDoc != null)
      {
          xNode = xmlDoc.SelectSingleNode("/Result");
          xNodeList = xNode.ChildNodes;
          foreach (XmlNode node in xNodeList)
          {
              elementValue = node.InnerText;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多