Alternative zu Vorfahren-oder-Selbst (oder wähle alle Knoten im tree mit einem bestimmten Kind-Knoten)

Ich versuche, alle Knoten in einem tree zu identifizieren, die zu einem bestimmten Knoten führen.

Ich versuche, dies entweder durch MSSQL XML (2005) oder durch die Microsoft.XMLDOM in ASP classic zu erreichen.

Ich kenne die Logik mit XPATH aber SQL server unterstützt nicht die ancestor-or-self Achse und XMLDOM scheint auf der :: Notation zu ersticken ..

Der xpath, der funktioniert, wenn ich es in XPATH-Testern teste, ist

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

mein XML (generiert rekursiv in SQL server) sieht aus wie

 <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> 

der XPATH sollte Knoten mit id (2,4,6) in beliebiger Reihenfolge auswählen, also kann ich ein Attribut zu allen von ihnen hinzufügen.

Dies ist für ein Menüsystem, wo ich nur das ausgewählte Blatt kenne, und muss so markiert sein, dass alle Knoten, die zu ihm führen,

Ich würde jede Unterstützung bei der Überwindung der XMLDOM- xml.documentElement.selectNodes("//static[@id=6]/ancestor-or-self::static") schätzen (das Ausführen von xml.documentElement.selectNodes("//static[@id=6]/ancestor-or-self::static") erzeugt den folgenden Fehler: Expected token 'eof' found ':'. //static[@id=6]/ancestor-or-self-->:<--:static )

oder mit der search nach einer alternativen Lösung. Vielleicht finden alle Knoten, die den spezifischen Knoten (mit id = 6) in jeder Tiefe enthalten ..

Beim Ausführen von W2K3 habe ich mit der IIS6 die Version MSXML2.XMLDomDocument.4.0 getestet.

 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 

Dies ist ein "Aufräumen der losen Enden" Art von Antworten.

Zuerst wäre Ihr primäres Problem, dass "Microsoft.XMLDOM" normalerweise Version 3.0 Implementierung (MSXML3.dll) laden würde. MSXML3 unterstützt die volle XPATH 1.0 Sprache, aber nicht standardmäßig. Die folgenden sollten genug sein, um zu reparieren: –

 dom.SetProperty "SelectionLanguage", "XPath" 

Marvin's Antwort enthält diese Zeile bei der Verwendung von MSXML4, aber es ist nicht wirklich notwendig, da XPath die Standard-Auswahlsprache auf 4 und höher ist.

Allerdings benutze ich das Wort oben beraten. Ich habe oft über server, die von einer Drittanbieter-Anwendung, die auch eine Verteilung von MSXML2, aber installieren Sie es falsch. Sie verursachen "Microsoft.XMLDOM" und das non-versionsspezifische "MSXML2.DOMDocument", um eine MSXML2.dll-Implementierung anstelle von MSXML3-Implementierungen zurückzugeben.

Ich empfehle daher, dass die beste ProgID zu verwenden ist "MSXML2.DOMDocument.3.0", da Sie genau wissen, was Sie bekommen. Darüber hinaus wird MSXML3.dll auf allen aktuell unterstützten Windows-Systemen aus der Box installiert. Auch MSXML3 blieb kompatibel mit Bugs in der MSXML2 Implentation, wenn das DOM-Dokument mit einem älteren ProgID aufgerufen wird. Mit der versionsspezifischen ProgID wird MSXML3 genauer an XML-Standards angepasst.