AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Filtern mit Xpath + Ausschluss von Knoten
Thema durchsuchen
Ansicht
Themen-Optionen

Filtern mit Xpath + Ausschluss von Knoten

Ein Thema von StTüff · begonnen am 9. Mai 2007 · letzter Beitrag vom 18. Dez 2015
Antwort Antwort
Seite 1 von 2  1 2      
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#1

Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 07:42
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 09:20
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 09:51
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 10:08
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>
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 10:13
....seltsam.... Ich auch: (siehe Anhang).

Vielleicht ist Xpath nicht gleich Xpath?

Gruß,

StTüff
Miniaturansicht angehängter Grafiken
xpath_156.jpg  
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 10:43
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 14:26
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 14:49
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Filtern mit Xpath + Ausschluss von Knoten

  Alt 9. Mai 2007, 15:29
Hallo!

Zum Werkzeug: XMLPad

Vielen Dank für die Erklärung!

Gruß,

StTüff
  Mit Zitat antworten Zitat
data2type

Registriert seit: 18. Dez 2015
1 Beiträge
 
#10

AW: Filtern mit Xpath + Ausschluss von Knoten

  Alt 18. Dez 2015, 12:13
Wer sich weiter informieren möchte, kann sich hier mal umschauen: http://www.data2type.de/xml-xslt-xsl...on-knotensets/
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 Uhr.
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