更新
感谢florent,我现在意识到我在问题中使用了错误的术语(最初是:“没有定义命名空间的XML文档的命名空间是什么?”)。
另外,我想现在我问两个问题:
1.可以为没有前缀的XML文档分配前缀吗? (可能是的,但是如何用经典的ASP做到这一点?)
2. XML文档中节点的XPath位置路径是什么,没有定义前缀?如果这是可能的话。
我有经典的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>
通过.responseXML属性自动解析和访问该文档。但是查找节点:
Set objData = obj_http.responseXML.selectSingleNode("//someNodeName")
Response.Write "Data: " & objData.Text
不起作用。 (我收到'Object Required'错误消息,表示未找到任何节点。)并且
Response.Write obj_http.responseXML.documentElement.prefix
给了我一个空字符串。
使这项工作的一种方法是使用.selectSingleNode("//*[local-name() = 'someNodeName']")
,但我想这在大型XML文档中效率不高。 (或者我错了吗?)
我已经读过类似:.selectSingleNode("//ns:rootNodeName/ns:childNodeName")
的内容,其中'ns'是定义的前缀,应该是要走的路,但是如果没有定义,我应该使用什么作为前缀?
答案 0 :(得分:2)
据我所知,“http://openapi.somesite.com/openapi-3.0.0”是该文档的命名空间。它只是没有定义前缀,因此这是默认命名空间。
我读过类似的东西: .selectSingleNode(“// ns:rootNodeName / ns:childNodeName”),其中'ns'是 定义的命名空间应该是要走的路,但那我应该怎么做 如果没有定义,则用于命名空间?
“ns”这里不是命名空间而是命名空间前缀。我不是ASP人员,所以我对代码无能为力,但您仍然可以为节点查找定义命名空间。如果您不想使用默认命名空间,甚至可以使用前缀重新定义它。
答案 1 :(得分: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