![]() |
XPATH mit Namespace
Hallo,
bei meinem ersten Versuch eine XPATH-Abfrage auf ein XML Dokument auszuführen habe ich diese Helper-Funktion verwendet, erhalte aber eine Fehlermeldung zur Laufzeit wenn ich im XPATH-Ausdruck einen Namespace verwende: Zitat:
Delphi-Quellcode:
De Delphi Code ist:
function selectSingleNode(ADOMDocument: IDOMDocument; const nodePath: WideString): IDOMNode;
var LDomNodeSelect : IDomNodeSelect; begin if not Assigned(ADOMDocument) or not Supports(ADOMDocument.documentElement, IDomNodeSelect, LDomNodeSelect) then Exit; //or just LDomNodeSelect:= (ADOMDocument.documentElement as IDOMNodeSelect); Result:=LDomNodeSelect.selectNode(nodePath); end;
Delphi-Quellcode:
Das XML Dokument ist eine SAP IDOC XML Datei, die einen Default-Namespace verwendet.
procedure TReader.Load(Filename: string);
var XmlDoc: IXMLDocument; LNode : IDOMNode; XPathExpr: string; begin XmlDoc := TXMLDocument.Create(nil); XmlDoc.Active := True; XmlDoc.Options := XmlDoc.Options + [doNodeAutoIndent]; XmlDoc.Version := '1.0'; XmlDoc.LoadFromFile(FileName); XPathExpr := '/NS1:SapInvoic01/NS1:SapInvoic01IDocBO'; LNode := selectSingleNode(XmlDoc.DOMDocument,XPathExpr); Info(LNode.nodeName); end; Das Delphi-Interface IDOMNodeSelect in der Unit xmldom ist so definiert:
Delphi-Quellcode:
Es gibt hier keine Methoden die einen XML Namespace verwenden.
{ IDOMNodeSelect }
IDOMNodeSelect = interface(IInterface) ['{2A3602E0-2B39-11D4-83DA-00C04F60B2DD}'] function selectNode(const nodePath: WideString): IDOMNode; safecall; function selectNodes(const nodePath: WideString): IDOMNodeList; safecall; end; Ist es mit IXmlDocument möglich den Default Namespace zu deklarieren damit er bei der XPath Auswertung bekannt ist, oder muss ich einen anderen Parser verwenden? |
AW: XPATH mit Namespace
Ich habe vor Jahren auch versucht XPath unter TXMLDocument einzusetzen. Damals scheiterte ich mehrmals beim Versuch SelectNode des unterliegenden XMLDom zu verwenden (Analoge Lösung zur gezeigten Helper-Funktion).
Seither verwende ich unter Windows immer direkt IXMLDOMDocument2 durch Import der Type Library MSXML2_TLB. Damit ist der Einsatz von XPath trivial:
Delphi-Quellcode:
Ich würde mir auch eine Unterstützung von XPath in TXMLDocument wünschen, vermute aber, dass dies aber auf anderen Plattformen (Mac/iOS/Android) nicht einfach zu lösen ist.
var
XMLDoc: IXMLDOMDocument2; NodeList: IXMLDOMNodeList; c: integer; const cFileName = 'test.groupproj'; cXPath = '/Project/ItemGroup/Projects/@Include'; begin XMLDoc := ComsDOMDocument.Create; try XMLDoc.load(cFilename); NodeList := XMLDoc.selectNodes(cXPath); |
AW: XPATH mit Namespace
Das sieht sehr gut aus!
Ich habe mittlerweile herausgefunden dass die Namespace Deklaration im Dokument nur das root-Element betraf und dass alle darunter liegenden Elemente im 'Leeren' Namespace liegen, damit funktionierte der XPatch Ausdruck tatsächlich auch wenn man den Namespace einfach wegliess :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 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