![]() |
OpenXML XPath Syntax problem
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 |
AW: OpenXML XPath Syntax problem
2008 hatte jemand ein ähnliches Problem:
![]() Müsste nicht erst ein XPath-Objekt irgendwo her? Das DomObjekt kann kein XPath. |
AW: OpenXML XPath Syntax problem
Zitat:
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. |
AW: OpenXML XPath Syntax problem
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 |
AW: OpenXML XPath Syntax problem
Ich habe
![]() Mit dem normal XMLDocument habe ich dort (über einen kleinen Umweg) XPath verwendet. Es hat jedenfalls für die ersten Versuche so funktioniert. |
AW: OpenXML XPath Syntax problem
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> |
AW: OpenXML XPath Syntax problem
Wenn ich XPath nutze nur mit dem MSXML und dem DOM.
openXML k.a. |
AW: OpenXML XPath Syntax problem
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> |
AW: OpenXML XPath Syntax problem
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.
Delphi-Quellcode:
.
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> |
AW: OpenXML XPath Syntax problem
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 ...} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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