Autor Beitrag
Sato
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 30.09.04 12:24 
Hai,
I want to ask how I use the XPathExpression component in Delphi ?? I need a result of XPath query into a my variable. Can I somewhere read a some manual, tutorial or help with examples about this component ?
Thank You for Your answer. Im sorry of my bad English ;-)
Sato, Czech Republic.
Luke1410
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 17.03.05 11:36 
Habe genau das gleiche Problem. Obwohl ich mitlerweile das ganze XDOM-Manual gelesen habe, funktioniert die Evaluierung des XPath-Ausdrucks irgendwie nicht. Auch im Netz ist leider kein Tutorial oder ähnliches zu finden, das mich weiterbringt.

Hier mal ein Auszug meines kläglichen Versuches:

zunächst die Test-XML-Datei:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE test SYSTEM "test.dtd">
<test>
  <customer id="0" min="0.0" max="500">
    custname1
  </customer>
  <customer id="1" min="1.0" max="500.50">
    custname2
  </customer>
  <customer id="5" min="1.0" max="500.50">
    custname3
  </customer>
</test>


Hier der Delphi-Code-Ausschnitt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// XPathExprCompName ist ein TXPathExpression-Objekt
// doc ist ein TdomDocument-Objekt - XML-Datei wurde korrekt geparst und Ausgabe über DomToXmlParser.writeToString zeigt auch den Inhalt an.

XPathExprCompName.Expression := '/customer';  // alternativ versucht: '.' und 'child::customer'
XPathExprCompName.contextNode := doc;
XPathExprCompName.evaluate; // liefert true zurück
XPathExprCompName.hasNodeSetResult; // liefert false zurück <- k.a. warum???
XPathExprCompName.resultAsWideString; // liefert leeren String zurück

// alternativer Versuch über doc-Objekt-Methode:
doc.evaluateToWideString('/customer'); // liefert leeren String zurück


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.03.05 12:02 
Ich rate einfach mal, weil ich von dieser Komponente absolut keine Ahnung habe. Aber XPath ist XPath, schätze ich. Da dein Dokument mit dem <test>-Knoten beginnt, du aber nur einen Slash benutzt, wird der <customer>-Knoten ganz oben gesucht. Entweder probierst du es also mal mit "//customer", oder du nimmst "/test/customer".
Luke1410
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 17.03.05 12:20 
Danke für die schnelle Antwort... Leider war's das nicht.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.03.05 12:34 
Mal nebenbei gefragt: Du willst doch sicher die ganzen <customer>-Knoten ermitteln und die darin enthaltenen Daten irgendwie in deinem Programm ver- bzw. bearbeiten. Richtig? Bist du denn sicher, dass "evaluateToWidestring" die richtige Funktion ist? Üblicherweise stellt der XML-Parser dafür "selectSingleNode" und "selectNodes". Soweit ich mich an frühere Beiträge hier im Forum erinnere war das auch beim XmlDocument von Delphi so.
Luke1410
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 17.03.05 12:45 
OpenXML-Manual hat folgendes geschrieben:

Chapter 9:
returnNode := myNode.evaluateToNode('child::para[position()=last()]');
returns the last 'para' child element of 'myNode', or nil if no such element exists.

Source: www.philo.de/xml/

Später (wenn das obige endl. funktioniert) wird's umgeschrieben und es soll ein spezieller customer-Knoten ermittelt werden (deshalb auch der Versuch das über XPath zu realisieren).

Da ich hier mit Delphi 4 arbeiten "darf", steht mir auch nicht der integrierte Delphi-Parser zur Verfügung und zwecks eventueller späterer Portierbarkeit möchte ich auch nicht den MSXML-Parser verwenden.
Im Moment läuft es auch über ein Pendant zu selectNodes/selectSingleNode. Diese Funktionen unterstützen bei XDOM allerdings afaik keine XPath-Ausdrücke und der ganze Vergleich ist zur Zeit selbst programmiert, was ich etwas unsauber finde, vor allem, da es ja wesentlich "einfacher" über XPath gehen könnte.