【问题标题】:Namespace of specific XML Node in c#c#中特定XML节点的命名空间
【发布时间】:2014-03-16 05:55:00
【问题描述】:

我有以下 XML 结构:

<?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <StoreResponse xmlns="http://www.some-site.com">
      <StoreResult>
        <Message />
        <Code>OK</Code>
      </StoreResult>
    </StoreResponse>
  </soap:Body>
</soap:Envelope>

我需要从本文档的Code获取 InnerText,我需要有关适当 XPATH 语句的帮助。

我真的对 XML 命名空间感到困惑。在处理另一个 XML 文档中的先前命名空间问题时,我了解到,即使 Code 前面没有任何内容(例如 ns:Code),它仍然是其父节点中 xmlns 属性定义的命名空间的一部分。现在,Code 的父节点中定义了多个 xmlns 节点。我需要在 XPATH 语句中指定的命名空间是什么?是否有“主命名空间”之类的东西?子节点是否继承其父节点的(主)命名空间?

【问题讨论】:

    标签: c# xml xpath namespaces


    【解决方案1】:

    元素的命名空间是<a href="/default/index/tourl?u=aHR0cDovL3d3dy5zb21lLXNpdGUuY29t" rel="nofollow" target="_blank">http://www.some-site.com</a>。 xmlsn:xxx 表示以 xxx: 为前缀的名称(如soap:Body)具有该名称空间。 xmlns 本身意味着这是没有任何前缀的名称的默认命名空间。

    【讨论】:

      【解决方案2】:

      使用 XDocument (Linq) 方法的示例:

      XNamespace ns = "http://www.some-site.com";
      
      var document = XDocument.Parse("your-xml-string");
      var elements = document.Descendants( ns + "StoreResult" )
      

      后代元素将继承最后一个直接命名空间。在您的示例中,您需要创建两个命名空间,一个用于肥皂信封,另一个用于“some-site”。

      【讨论】:

        【解决方案3】:

        这是我在这个问题中找到的一个选项:Weirdness with XDocument, XPath and namespaces

        var xml = "<your xml>";
        var doc = XDocument.Parse(xml); // Could use .Load() here too
        var code = doc.XPathSelectElement("//*[local-name()='Code']");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-19
          • 2014-07-23
          • 1970-01-01
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 2016-06-09
          • 1970-01-01
          相关资源
          最近更新 更多