1

特定のノードにつながるツリー内のすべてのノードを識別しようとしています。

MSSQL XML (2005) または ASP クラシックの Microsoft.XMLDOM を使用してこれを達成しようとしています。

XPATH のロジックは知っていますが、SQL Server はancestor-or-self軸をサポートしておらず、XMLDOM は::表記法で詰まるようです。

XPATHテスターでテストするときに機能するxpathは

//static[@id=6]/ancestor-or-self::static

私のXML(SQLサーバーで再帰的に生成された)は次のようになります

<root>
  <static id="1" title="some title 1" />
  <static id="2" title="some title 2">
     <children>
        <static id="3" title="some title 3" />
        <static id="4" title="some title 4">
          <children>
            <static id="5" title="some title 5" />
            <static id="6" title="some title 6" />
          </children>
        </static>
     </children>
  </static>
  <static id="7" title="some title 7" />
</root>

XPATH は任意の順序で ID (2,4,6) のノードを選択する必要があるため、それらすべてに属性を追加できます。

これは、選択したリーフのみを知っているメニュー システム用であり、それにつながるすべてのノードをハイライトとしてマークする必要があります。

XMLDOM のチョークを克服するための支援をいただければ幸いです (実行xml.documentElement.selectNodes("//static[@id=6]/ancestor-or-self::static")すると次のエラーが生成Expected token 'eof' found ':'. //static[@id=6]/ancestor-or-self-->:<--:staticされます:) 。

または代替ソリューションを見つけることで。任意の深さで特定のノード (id = 6 ) を含むすべてのノードを見つける可能性があります..

4

2 に答える 2

4

これは、「未解決の問題を片付ける」一種の答えです。

まず、主な問題は、"Microsoft.XMLDOM" が通常バージョン 3.0 の実装 (MSXML3.dll) をロードすることです。MSXML3 は XPATH 1.0 言語を完全にサポートしていますが、デフォルトではサポートしていません。修正するには、次の手順で十分です。

dom.SetProperty "SelectionLanguage", "XPath"

Marvin の回答には、MSXML4 を使用する場合にこの行が含まれていますが、4 以降では XPath がデフォルトの選択言語であるため、実際には必要ありません。

ただし、私は上記の「べき」という言葉を慎重に使用しています。MSXML2 のディストリビューションも含まれているが、正しくインストールされていないサードパーティ アプリケーションによって侵害されたサーバーによく遭遇します。これにより、"Microsoft.XMLDOM" およびバージョン固有ではない "MSXML2.DOMDocument" が、MSXML3 実装ではなく MSXML2.dll 実装を返します。

したがって、取得する内容が正確にわかっているため、通常、使用する最適な ProgID は "MSXML2.DOMDocument.3.0" であることをお勧めします。さらに、MSXML3.dll は、現在サポートされているすべての Windows OS にすぐにインストールできることが保証されています。また、MSXML3 は、古い progID を使用して DOM ドキュメントが呼び出された場合の MSXML2 実装のバグとの互換性を維持していました。バージョン固有の ProgID を使用すると、MSXML3 がより厳密に XML 標準に準拠するようになります。

于 2010-02-27T19:46:08.120 に答える
1

IIS6 を使用して W2K3 で実行し、MSXML2.XMLDomDocument.4.0 バージョンをテストしました。

Dim XMLDom ''# As MSXML2.DOMDocument40

Set XMLDom = CreateObject("MSXML2.DOMDocument.4.0")
Call XMLDom.setProperty("SelectionLanguage", "XPath")

Call XMLDom.loadXML( {document as described above - mistakes in original xml doc)
)


Dim originalQuery ''# As String
originalQuery = "//static[@id=6]/ancestor-or-self::static"

Dim replacementQuery ''# As String
replacementQuery = "//static[descendant::static[@id=6] or @id=6]"


Dim XmlElemList ''# As MSXML2.IXMLDOMNodeList
Set XmlElemList = XMLDom.documentElement.selectNodes(originalQuery)

Dim XmlElemList2 ''# As MSXML2.IXMLDOMNodeList
Set XmlElemList2 = XMLDom.documentElement.selectNodes(replacementQuery)

Dim XmlElem ''# As MSXML2.IXMLDOMElement
Call Response.Write("Using original query : '" & originalQuery & "' (" & XmlElemList.Length & ")<br>")
For Each XmlElem In XmlElemList
    Call Response.Write("XmlEntry : " & XmlElem.getAttribute("id") & "<br>")
    Call Response.Write("****<br>")
Next

Call Response.Write("Using replacement query : '" & replacementQuery & "' (" & XmlElemList2.Length & ")<br>")
For Each XmlElem In XmlElemList2
    Call Response.Write("XmlEntry : " & XmlElem.getAttribute("id") & "<br>")
    Call Response.Write("****<br>")
Next
于 2010-02-27T00:30:32.560 に答える