2012-12-11 134 views
3

更新 感謝florent我現在意識到我在問題中使用了錯誤的術語(最初是:'沒有定義名稱空間的XML文檔的名稱空間是什麼?')。
另外,我想現在我問了兩個問題:
1.能爲一個沒有前綴的XML文檔分配一個前綴嗎? (可能是的,但是如何用傳統的ASP來做到這一點?)
2.什麼是沒有定義前綴的XML文檔中節點的XPath位置路徑?如果這甚至是可能的。沒有定義前綴的XML文檔的前綴是什麼?


我有傳統ASP代碼以檢索使用MSXML2.ServerXMLHTTP.6.0對象的XML文檔,但是XML文檔不具有前綴限定。我無法改變XML文檔的製作方式。

這是XML的外觀:

<?xml version="1.0" standalone="yes"?> 
<SearchResultsResponse xmlns="http://openapi.somesite.com/openapi-3.0.0"> 
[...] 
</SearchResultsResponse>  


文檔會自動解析和accessable低谷.responseXML財產。但隨着查找節點:

Set objData = obj_http.responseXML.selectSingleNode("//someNodeName") 
Response.Write "Data: " & objData.Text 

不起作用。 (我收到了「對象需要」錯誤消息,這意味着沒有節點被發現。)而

Response.Write obj_http.responseXML.documentElement.prefix 

給我一個空字符串。使這項工作


一種方法是使用.selectSingleNode("//*[local-name() = 'someNodeName']"),但我想這不是更大的XML文檔非常有效的。 (或者我錯了嗎?)

我讀過類似於:.selectSingleNode("//ns:rootNodeName/ns:childNodeName"),其中'ns'是定義的前綴,應該是要走的路,但是如果沒有定義,我應該如何使用前綴?

回答

2

我終於想通了:

Dim obj_XML 
Set obj_XML = obj_http.responseXML 

' this is where the magic happens, 'ns' is defined as the prefix: 
obj_XML.setProperty _ 
    "SelectionNamespaces", _ 
    "xmlns:ns='http://openapi.somesite.com/openapi-3.0.0' " &_ 
    "xmlns:xs='http://www.w3.org/2001/XMLSchema'" 

Dim obj_node 
' now we can get the node with an XPath location path with the 'ns' prefix: 
Set obj_node = obj_XML.selectSingleNode("//ns:SearchResultsResponse/ns:SessionId") 

If obj_node Is Nothing Then 
    Response.Write "# No node found #<br />" 
Else 
    Response.Write "Node text: " & obj_node.Text & "<br />" 
End If 
2

據我瞭解「http://openapi.somesite.com/openapi-3.0.0」是文檔的命名空間。它只是沒有定義前綴,所以這是默認的命名空間。

我已閱讀,是這樣的: .selectSingleNode( 「// ns:對rootNodeName/NS:childNodeName」),其中 'NS' 是 定義的命名空間,應該是要走的路,但後來什麼如果沒有定義,我應該使用 作爲命名空間嗎?

「ns」這裏不是命名空間,而是命名空間前綴。我不是一個ASP人員,所以我對代碼無能爲力,但您仍然應該能夠爲您的節點查找定義一個名稱空間。如果您不想使用默認名稱空間,您甚至應該能夠使用前綴重新定義它。

+0

你是絕對正確的。作爲XML的新手,我使用了錯誤的術語。我會更新我的問題。 –

+0

我不熟悉msxml,所以我不能多說這個特例。但是你總是可以在解析器中重新定義前綴(例如在xslt中),然後在你的xpath中使用這個前綴。 – florent

+0

看這裏:http://social.msdn.microsoft。COM /論壇/是/ xmlandnetfx /線程/ 5ae834d2-59ed-44d6-b6da-0a7bf5795caa 你應該能夠與屬性重新定義命名空間: objResponse.responseXML.setProperty( 「SelectionNamespaces」,「的xmlns:myns名字= 'http://openapi.somesite.com/openapi-3.0.0'「) objResponse.responseXML.selectSingleNode(」// someNodeName「) – florent

相關問題