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