Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Filtern mit Xpath + Ausschluss von Knoten (https://www.delphipraxis.net/91726-filtern-mit-xpath-ausschluss-von-knoten.html)

StTüff 9. Mai 2007 06:42


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:
<Ebene1>
   <Ebene2 att=?>
      <Ebene3>
         <Ebene4>
           Beispiel 1
         </Ebene4>
      </Ebene3>
   </Ebene2>
   <Ebene2 att=?>
      <Ebene3>
        Beispiel 2
      </Ebene3>
   </Ebene2>
   <Ebene2 att=?>
     Beispiel 3
   </Ebene2>
</Ebene1>
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.
Ü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

marabu 9. Mai 2007 08:20

Re: Filtern mit Xpath + Ausschluss von Knoten
 
Hallo,

der von dir gesuchte Filter könnte so aussehen:

Delphi-Quellcode:
uses
  Msxml2;

var
  nl: IXMLDOMNodeList;
  doc: IXMLDOMDocument2;

begin
  // ...
  nl := doc.documentElement.selectNodes('*[not(Ebene3) or */Ebene4]');
end;
Grüße vom marabu

StTüff 9. Mai 2007 08:51

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

marabu 9. Mai 2007 09:08

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>

StTüff 9. Mai 2007 09:13

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

marabu 9. Mai 2007 09:43

Re: Filtern mit Xpath + Ausschluss von Knoten
 
Ich kenne dein Testwerkzeug nicht. Hier ist meins:

Delphi-Quellcode:
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.
Freundliche Grüße

StTüff 9. Mai 2007 13:26

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

marabu 9. Mai 2007 13:49

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

StTüff 9. Mai 2007 14:29

Re: Filtern mit Xpath + Ausschluss von Knoten
 
Hallo!

Zum Werkzeug: XMLPad

Vielen Dank für die Erklärung!

Gruß,

StTüff

data2type 18. Dez 2015 11:13

AW: Filtern mit Xpath + Ausschluss von Knoten
 
Wer sich weiter informieren möchte, kann sich hier mal umschauen: http://www.data2type.de/xml-xslt-xsl...on-knotensets/


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz