3

更新 florentのおかげで、質問で間違った用語を使用していることに気付きました(元々:「名前空間が定義されていないXMLドキュメントの名前空間は何ですか?」)。
また、私は今、2つの質問をしていると思います
。1。プレフィックスのないXMLドキュメントにプレフィックスを割り当てることはできますか?(おそらくそうですが、従来のASPでこれをどのように行うのですか?)
2。プレフィックスが定義されていないXMLドキュメント内のノードのXPathロケーションパスは何ですか?これが可能であれば。


MSXML2.ServerXMLHTTP.6.0オブジェクトを使用してXMLドキュメントを取得する従来のASPコードがありますが、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

動作しません。(「オブジェクトが必要です」というエラーメッセージが表示されます。これは、ノードが見つからなかったことを意味します。)そして

Response.Write obj_http.responseXML.documentElement.prefix 

空の文字列を表示します。


これを機能させる1つの方法はを使用する.selectSingleNode("//*[local-name() = 'someNodeName']")ことですが、これは大きなXMLドキュメントではあまり効率的ではないと思います。(または私はそこで間違っていますか?)

「ns」が定義されたプレフィックスである次のようなものを読んだことがあります.selectSingleNode("//ns:rootNodeName/ns:childNodeName")が、何も定義されていない場合、プレフィックスに何を使用する必要がありますか?

4

2 に答える 2

2

私が理解している限り、「http://openapi.somesite.com/openapi-3.0.0」はドキュメントの名前空間です。プレフィックスが定義されていないため、これがデフォルトの名前空間です。

.selectSingleNode( "// ns:rootNodeName / ns:childNodeName")のようなものを読んだことがあります。ここで、'ns'は定義された名前空間ですが、名前空間がない場合は何を使用すればよいですか。定義されていますか?

ここでの「ns」は名前空間ではなく、名前空間プレフィックスです。私はASPの人間ではないので、コードについてはあまり役に立ちませんが、ノードルックアップ用の名前空間を定義できるはずです。デフォルトの名前空間を使用したくない場合は、プレフィックスを使用して再定義することもできます。

于 2012-12-12T10:08:03.397 に答える
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
于 2012-12-16T22:49:11.457 に答える