没有定义前缀的XML文档的前缀是什么?

时间:2012-12-11 18:31:53

标签: xml namespaces msxml serverxmlhttp

更新 感谢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'是定义的前缀,应该是要走的路,但是如果没有定义,我应该使用什么作为前缀?

2 个答案:

答案 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
相关问题