c#中特定XML节点的命名空间

时间:2014-02-17 04:09:18

标签: c# xml xpath namespaces

我有以下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语句中指定什么名称空间?有没有“主命名空间”这样的东西?子节点是否继承了父节点的(主)名称空间?

3 个答案:

答案 0 :(得分:1)

&lt; Code&gt;的名称空间元素是http://www.some-site.com。 xmlsn:xxx表示前缀为xxx的名称:(如soap:Body)具有该命名空间。 xmlns本身意味着这是没有任何前缀的名称的默认命名空间。

答案 1 :(得分:0)

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

XNamespace ns = "http://www.some-site.com";

var document = XDocument.Parse("your-xml-string");
var elements = document.Descendants( ns + "StoreResult" )

后代元素将继承最后一个直接命名空间。在您的示例中,您将需要为soap信封创建两个名称空间,为“some-site”创建第二个名称空间。

答案 2 :(得分:0)

以下是我在此问题中找到的一个选项: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']");