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:
Reference to undeclared namespace prefix: 'NS1'
Delphi-Quellcode:
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;
De Delphi Code ist:
Delphi-Quellcode:
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
XML Dokument ist eine SAP IDOC
XML Datei, die einen Default-Namespace verwendet.
Das Delphi-Interface IDOMNodeSelect in der
Unit xmldom ist so definiert:
Delphi-Quellcode:
{ IDOMNodeSelect }
IDOMNodeSelect = interface(IInterface)
['{2A3602E0-2B39-11D4-83DA-00C04F60B2DD}']
function selectNode(const nodePath: WideString): IDOMNode; safecall;
function selectNodes(const nodePath: WideString): IDOMNodeList; safecall;
end;
Es gibt hier keine Methoden die einen
XML Namespace verwenden.
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?