![]() |
Filtern mit Xpath + Ausschluss von Knoten
Hallo @all!
Ist es möglich mit Xpath auch Knoten auszuschließen? Mit "|" können ja zwei Suchergebnise vereinigt werden und es gibt auch "not()".... Ich mache am Besten mal ein Beispiel:
XML-Code:
Ich möchte jetzt so Filtern, dass ich alle Elemente der Ebene 2 erhalte (wäre also "//Ebene2") - und jetzt kommt's - die entweder Unterelemte bis Ebene4 haben, oder aber keine Kindknoten. Es soll also die Struktur, die "Beispiel 2" enthält, ausgeschlossen werden.
<Ebene1>
<Ebene2 att=?> <Ebene3> <Ebene4> Beispiel 1 </Ebene4> </Ebene3> </Ebene2> <Ebene2 att=?> <Ebene3> Beispiel 2 </Ebene3> </Ebene2> <Ebene2 att=?> Beispiel 3 </Ebene2> </Ebene1> Übrigens sind die Attribute (att) unbekannt, die sollten also nicht für eine Filterregel verwendet werden (sonst wär's ja wieder zu einfach ;-) ). Ich glaube, dass dies nicht so einfach möglich ist und habe daher den Filter in Delphi umgesetzt. Ich lasse mich aber gerne eines Besseren belehren. Viele Grüße, StTüff |
Re: Filtern mit Xpath + Ausschluss von Knoten
Hallo,
der von dir gesuchte Filter könnte so aussehen:
Delphi-Quellcode:
Grüße vom marabu
uses
Msxml2; var nl: IXMLDOMNodeList; doc: IXMLDOMDocument2; begin // ... nl := doc.documentElement.selectNodes('*[not(Ebene3) or */Ebene4]'); end; |
Re: Filtern mit Xpath + Ausschluss von Knoten
Hallo Marabu!
Danke für die Antwort. Hast Du das getestet? Bei mir funktioniert das leider nicht (es werden alle Knoten ausgewählt). Gruß, StTüff |
Re: Filtern mit Xpath + Ausschluss von Knoten
Getestet habe ich mit diesem Dokument:
XML-Code:
<?xml version="1.0"?>
<Ebene1> <Ebene2 att="?"> <Ebene3> <Ebene4> Beispiel 1 </Ebene4> </Ebene3> </Ebene2> <Ebene2 att="?"> <Ebene3> Beispiel 2 </Ebene3> </Ebene2> <Ebene2 att="?"> Beispiel 3 </Ebene2> </Ebene1> |
Re: Filtern mit Xpath + Ausschluss von Knoten
Liste der Anhänge anzeigen (Anzahl: 1)
....seltsam.... Ich auch: (siehe Anhang).
Vielleicht ist Xpath nicht gleich Xpath? Gruß, StTüff |
Re: Filtern mit Xpath + Ausschluss von Knoten
Ich kenne dein Testwerkzeug nicht. Hier ist meins:
Delphi-Quellcode:
Freundliche Grüße
program XPath;
{$APPTYPE CONSOLE} uses ActiveX, Msxml2, SysUtils; var doc: IXMLDOMDocument2; function NodeList(doc: IXMLDOMDocument2; xp: string): IXMLDOMDocument2; var i: Integer; nl: IXMLDOMNodeList; begin Result := CoDomDocument.Create; Result.async := False; nl := doc.documentElement.selectNodes(xp); Result.documentElement := Result.createElement('nodelist'); for i := 0 to Pred(nl.length) do Result.documentElement.appendChild(nl.item[i].cloneNode(True)); end; begin if ParamCount <> 3 then begin WriteLn('usage: xpath pathexpr xmlinput xmloutput'); Halt; end; CoInitialize(nil); doc := CoDomDocument.Create as IXMLDOMDocument2; doc.async := False; if doc.load(ParamStr(2)) then NodeList(doc, ParamStr(1)).save(ParamStr(3)) else WriteLn(doc.parseError.reason); CoUninitialize; end. |
Re: Filtern mit Xpath + Ausschluss von Knoten
Hmm, mit Deinem Tool geht's (natürlich).
Ich bin jetzt etwas verunsichert. Kann ich mich jetzt darauf verlassen, dass das funktioniert, oder nicht? Ist das noch von der Version von MSXML abhängig? Ich habe es in meiner Software jetzt vorsichtshalber (wie schon anfangs gesagt) anders realisiert. Aber noch mal zum verwendeten Xpath-Ausdruck: "*[not(Ebene3) or */Ebene4]" Wie ist das genau zu verstehen (insbesondere die eckige Klammer). Ich versuchs mal zu interpretieren: Alle Elternknoten deren Kindelemente entweder keine Ebene3 enthalten, oder (or) eine Ebene4 enthalten. Stimmt das so in etwa? Gruß und vielen Dank! StTüff |
Re: Filtern mit Xpath + Ausschluss von Knoten
Hallo,
wichtig scheint mir zu sein, dass der XPath-Ausdruck in deinem Programm funktioniert. Wenn es mit deinem Testwerkzeug nicht funktioniert, dann erschüttert das nur mein Vertrauen in das Testwerkzeug (gibt es da einen Download-URL?). Zu meinem XPath-Ausdruck: Der Stern außerhalb der eckigen Klammern bezeichnet die childnodes des Knoten, dessen Methode selectNode() ich aufrufe: documentElement = Ebene1. In der eckigen Klammer gebe ich die Filterbedingung an. Der Referenzknoten für die Pafde dort ist der soeben außen gefundene Knoten - Ebene2. Freundliche Grüße |
Re: Filtern mit Xpath + Ausschluss von Knoten
|
AW: Filtern mit Xpath + Ausschluss von Knoten
Wer sich weiter informieren möchte, kann sich hier mal umschauen:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz