2012-06-13 57 views
2

我有一個XML字符串像這樣:使用createNSResolver在XML中指定多個命名空間

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <ExecuteResponse xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services"> 
     <ExecuteResult i:type="a:RetrieveEntityResponse" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <a:ResponseName>RetrieveEntity</a:ResponseName> 
     <a:Results xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> 
      <a:KeyValuePairOfstringanyType> 
      <b:key>Some Value</b:key> 
      </a:KeyValuePairOfstringanyType> 
     </a:Results> 
     </ExecuteResult> 
    </ExecuteResponse> 
    </s:Body> 
</s:Envelope> 

我試圖做的線沿線的東西:

var resolver = xmlDoc.createNSResolver(xmlDoc.documentElement); 
return new XPathEvaluator().evaluate("//b:key", xmlDoc.documentElement, resolver, XPathResult.ANY_TYPE, null); 

的關鍵節點沒有被找到,原因是當我打電話時

resolver.lookupNamespaceURI("b") 

直接,它返回null。但是,它返回的東西,當我做

resolver.lookupNamespaceURI("s") 

所以我最好的猜測是createNSResolver方法只查找在傳入的XML文檔的根節點的命名空間。有沒有什麼辦法讓它找到所有在xml中定義的名稱空間,還是以其他方式構建文檔中存在的所有名稱空間的列表?

謝謝!

回答

3

在一般情況下,根據XML文檔中的所有名稱空間聲明設置一致的名稱空間解析是不可能的,

<root xmlns="http://example.com/n1"> 
    <foo xmlns="http://example.com/n2"> 
    <p1:bar xmlns:p1="http://example.com/n1"> 
    <p2:baz xmlns:p2="http://example.com/n1">...</p2:baz> 
    </p1:bar> 
    </foo> 
</root> 

其中相同的命名空間與不同的前綴一起使用,當然你也可以有樣本例如。

<p:foo xmlns:p="http://example.com/n1"> 
    <p:bar xmlns:p="http://example.com/n2">...</p:bar> 
</p:foo> 

其中相同的前綴綁定到不同元素上的不同名稱空間URI。

因此,基本上你需要知道你正在尋找的元素節點的名稱空間URI,然後你可以用你的代碼可以選擇的任何前綴來設置名稱空間解析器。

return xmlDoc.evaluate("//pf:key", xmlDoc, function(prefix) { if (prefix === 'pf' return 'http://schemas.datacontract.org/2004/07/System.Collections.Generic'; else return null; }, XPathResult.ANY_TYPE, null); 

在與簡單的路徑,我不會使用XPath和evaluate可言,而是去爲return xmlDoc.getElementsByTagNameNS('http://schemas.datacontract.org/2004/07/System.Collections.Generic', 'b');另一方面。

至於查找DOM樹中的名稱空間聲明以基於前綴自己構建名稱空間解析器,XPath可以通過查看名稱空間軸來自我提供一些幫助,例如, //namespace::*但在瀏覽器內部Mozilla/Firefox從未認爲有必要支持命名空間軸。然後有一些DOM級別3方法http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefixhttp://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI,因此您可以編寫自己的代碼遍歷DOM樹並收集名稱空間聲明,但這在一般情況下無助於解決上述兩個示例示例中列出的問題。

+0

感謝您的所有信息。 –