AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OpenXML XPath Syntax problem

Ein Thema von Kostas · begonnen am 1. Feb 2011 · letzter Beitrag vom 3. Apr 2013
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

OpenXML XPath Syntax problem

  Alt 1. Feb 2011, 09:43
Hallo Zusammen,
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>

 <store>

   <ResultRecord StartID="1452">
     <Total>60</Total>
   </ResultRecord>

   <ResultRecord StartID="1453">
     <Total>40</Total>
   </ResultRecord>

   <ResultRecord StartID="1454">
     <Total>86</Total>
   </ResultRecord>

 </store>

Das XML zu oberst, ist stark vereinfacht um das Problem nachzustellen.
Ich versuche das Tag "Total" per XPath zu greifen. Leider bekomme ich eine
"Not supported error." Exception.

Delphi-Quellcode:
  //Den Syntax habe ich von: http://www.w3schools.com/xpath/xpath_syntax.asp

  TotalNode := FDoc.EvaluateToNode('/store/ResultRecord[@StartID="1452"]/Total');

Hat jemand eine Idee warum?

Gruß Kostas
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#2

AW: OpenXML XPath Syntax problem

  Alt 1. Feb 2011, 11:07
2008 hatte jemand ein ähnliches Problem:
http://www.delphipraxis.net/115068-o...atetonode.html

Müsste nicht erst ein XPath-Objekt irgendwo her?
Das DomObjekt kann kein XPath.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: OpenXML XPath Syntax problem

  Alt 1. Feb 2011, 14:57
2008 hatte jemand ein ähnliches Problem:
http://www.delphipraxis.net/115068-o...atetonode.html

Müsste nicht erst ein XPath-Objekt irgendwo her?
Das DomObjekt kann kein XPath.

Hallo,

das ist doch schon mal ein guter Hinweis. Es gibt ja auch die Komponente "XPathExpression"
Möglicherweise muss damit etwas angestellt werden. Ich werde weitersuchen.
Sicherlich könnte ich alle nodes durchlaufen und mir die Werte einlesen. Wenn es jedoch
mit XPath gehen würde, so wäre das eine sehr elegante Lösung.

Gruß Kostas.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: OpenXML XPath Syntax problem

  Alt 4. Feb 2011, 16:21
Hallo Zusammen,

ich habe jetzt alles versucht darauf zu kommen wie XPath in verbindung mit OpenXML funktioniert, doch leider ohne Erfolg.
Auch den Autor von OpenXML habe ich angeschrieben, doch leider bis Heute noch keine Antwort.

Ist denn niemand im Forum der XPath nutzt?

Aktuell habe ich mein Problem gelöst indem ich mich Rekursiv durch die komplette XML Datei hangle.
Schön finde ich das nicht, wenn man weiß das es XPath gibt. Vermutlich ist es ganz was einfaches.

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: OpenXML XPath Syntax problem

  Alt 4. Feb 2011, 16:42
Ich habe hier mal meine damaligen Erkenntnisse mit XML in ein paar Videos zusammengefasst.
Mit dem normal XMLDocument habe ich dort (über einen kleinen Umweg) XPath verwendet. Es hat jedenfalls für die ersten Versuche so funktioniert.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: OpenXML XPath Syntax problem

  Alt 8. Feb 2011, 14:46
Hallo Stahli,

ich hebe mir soeben Deine Videos angeschaut die sehr informativ sind.
Die Methode mit den "XML-Datenbingungsexperten" wäre wohl die eleganteste.
Doch leider kann ich sie nicht verwenden da ich nur Delphi5 Enterprice habe
um alte Projekte weiter zu pflegen. Noch zudem unterscheidet sich die Struktur
innerhalb gleicher childs, und nicht zuletzt sind die XML-Files doch recht groß.

XPath wollte ich verwenden um Tags zu finden die Namentlich immer gleich sind
jedoch in der Reihenfolge sich unterscheiden können.

Als Beispiel: Das Tag Name kann nicht über den Index angesprochen werden.
Mit XPath wäre es egal wo es steht innerhalb eines Parentnode.

Ich suche also weiterhin nach einer Lösung mit XPath zusammen mit OpenXML.
Oder eine andere Komponente als OpenXML die auch XPath geherscht.
Aktuell habe ich eine Methode die mir alle childs nach einen passenden Tag durchsucht.

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
 
<store>
 
<ResultRecord StartID="1452">
 <Total>60</Total>
 <Name>Huber</Name>
 </ResultRecord>
 
<ResultRecord StartID="1453">
 <Name>Max</Name>
 <Total>40</Total>
 </ResultRecord>
 
<ResultRecord StartID="1454">
 <Total>86</Total>
 <Alter>17</Alter>
 <Name>Moritz</Name>
 </ResultRecord>
 
</store>
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#7

AW: OpenXML XPath Syntax problem

  Alt 8. Feb 2011, 16:54
Wenn ich XPath nutze nur mit dem MSXML und dem DOM.

openXML k.a.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: OpenXML XPath Syntax problem

  Alt 8. Feb 2011, 17:19
Hallo generic,

mein Problem ist das XML-File hat keine beständige Struktur.
In dem Beispiel unten ist das Tag Name nicht immer an zweiter Stelle,
es kann sogar komplett fehlen!

Ich muss also zwingend nach dem Namen suchen und wenn vorhanden, dessen Wert auslesen.
Kennst du zufällig so ein Beispiel mit MSXML?
Ich habe mir soeben die Microsoft XML 6.0 TLB importiert.

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
 
<store>
 
<ResultRecord StartID="1452">
 <Total>60</Total>
 <Name>Huber</Name>
 </ResultRecord>
 
<ResultRecord StartID="1453">
 <Name>Max</Name>
 <Total>40</Total>
 </ResultRecord>
 
<ResultRecord StartID="1454">
 <Total>86</Total>
 <Alter>17</Alter>
 <Name>Moritz</Name>
 </ResultRecord>
 
</store>
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#9

AW: OpenXML XPath Syntax problem

  Alt 8. Feb 2011, 18:11
MSXML kann XPath und das sollte auch dein D5 verstehen, jedenfalls brauchst du nur passende Header (ich weiß jetzt nur nicht, ob die in D5 schon enthalten sind und wenn nicht, wie man diese importieren kann).
MSXML ist fast immer in Windows schon enthalten und kann demnach direkt verwendet werden.



Total := FDoc.FindNode('ResultRecord/Name/../Total').Value .
= <ResultRecord> suchen, davon den Unterknoten <Name> nehmen, in gleichen Ebene <Total> suchen und davon den Wert nehmen

Es gab aber auch sowas wie ListNodes (oder irgendwie so), welches gleich alle <Total> in einer NodeListe liefert, welches in irgendeiner Weise diesem ähnelt:
Code:
<ResultRecord>
  <Name></Name>
  <Total>...</Total>
</ResultRecord>
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Feb 2011 um 18:20 Uhr)
  Mit Zitat antworten Zitat
kostgr

Registriert seit: 4. Dez 2008
5 Beiträge
 
Delphi 2010 Professional
 
#10

AW: OpenXML XPath Syntax problem

  Alt 3. Apr 2013, 08:59
Für diejenigen, die nach der Lösung des Problems "XPath mit OpenXML nutzen" suchen:
Ich glaube, ich habe die Antwort von dem Author von OpenXML gefunden (in den Beispielen zu der 5.1 Version von ADOMCore)
Delphi-Quellcode:
// The XPath data model is based on XML Namespaces (cf. the introduction to
// the XPath spec. available at "http://www.w3.org"). XML Namespace
// conformance can only fully be checked by validating a document (cf. sec. 6
// of the "Namespaces in XML" spec. also available at "http://www.w3.org").
// Therefore, we use a four step process here:
// 1. Parse the document into a "normal" XML tree.
// 2. Validate it.
// 3. Parse the "normal" document tree into a namespace-aware document tree.
// 4. Validate the namespace-aware object tree.
// NB: a) Since the XPath data model is based on XML Namespaces, XPath
// works only with namespace-aware document trees.
// b) Since the XPath data model does not include a document type
// declaration node, the XmlDocBuilder.KeepDocumentTypeDecl flag must be
// set to 'False'.
// c) Since the XPath data model treats default attributes the same as
// specified attributes, the XmlStandardDomReader.IgnoreUnspecified flag
// must be set to 'False'.
// d) Since in the XPath data model there are no attributes corresponding to
// attributes that declare namespaces, the
// XmlNamespaceSignalGenerator.SupressXmlns flag is set to 'True'.
    with XmlToDomParser do begin
      try
        Doc_1 := ParseFile(OpenDialog.FileName, True);
        try
        (*if not Doc_1.ValidationAgent.ValidateDocument(erReplace) then begin
            ShowErrorMessage('Document is invalid!');
            Doc_1.Free;
            Exit;
          end;                              *)

          Doc_2 := TDomDocumentXPath.Create(Doc_1.DomImplementation);
          Doc_2.Clear;
          XmlDomBuilder.ReferenceNode := Doc_2;
          if not XmlStandardDomReader.Parse(Doc_1) then begin
            ShowErrorMessage('Conversion to XPath data model failed!');
            Doc_2.Free;
            Exit;
          end;
        finally
          Doc_1.Free;
        end;
      except
        ShowErrorMessage('Document is not well-formed!');
        Exit;
      end;
    end; {with ...}
Konstantin
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:15 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