Hallo.
"xmlns" steht für
XML Namespace (behaupte ich jetzt einfach mal
). In deinem Fall benutzt die komplette Datei den gleichen Namespace. Und daran liegt es auch, dass "selectSingleNode" nichst findet. Hast du die MS-
XML-Doku in der Nähe? Dann schau mal rein, da steht das auch drin.
Also, dein Anfang war schon mal okay. Ich nehme jetzt mal
XML 4, aber mit Version 3 sollte es auch so funktionieren:
Delphi-Quellcode:
const
strNS = '
x-schema:.\Openshipments.xdr';
strNamespace = '
xmlns="' + strNS + '
"';
var
xmldoc : DomDocument40;
root,
node : IXMLDomNode;
begin
xmldoc := CoDomDocument40.Create;
if(xmldoc <>
nil)
then
try
xmldoc.async := true;
xmldoc.validateOnParse := false;
xmldoc.resolveExternals := false;
// XML-Grundcode
xmldoc.loadXML('
<?xml version="1.0" encoding="windows-1252"?>' + #13#10 +
'
<OpenShipments ' + strNamespace + '
>' + #13#10 +
'
<OpenShipment ProcessStatus=""/>' + #13#10 +
'
</OpenShipments>');
So, damit der
XML-Parser jetzt auch den Knoten findet, musst du selbst noch mal den Namespace deklarieren. Das Problem ist, dass der Namespace kein Suffix/Präfix hat. Also musst du dir selbst einen ausdenken, sonst kannst du mit
XPath nicht richtig suchen. Ich nehme einfach mal deinen Nick als Suffix:
Delphi-Quellcode:
const
strSelNS = 'xmlns:keldorn="' + strNS + '"';
begin
{ ... }
// Namespace setzen, allerdings mit eigenem Präfix, wg.
// "selectSingleNode" und Co.
xmldoc.setProperty('SelectionNamespaces',strSelNS);
Das ist jetzt nur für den Parser von Interesse, weil du den Suffix nun als Präfix beim Suchen verwendest:
Delphi-Quellcode:
root := xmldoc.selectSingleNode('/keldorn:OpenShipments/' +
'keldorn:OpenShipment');
Jetzt sollte der Knoten gefunden werden, und du kannst den neuen anlegen. Nimm hier aber nicht "createElement", denn das geht offenbar davon aus, dass der zu erzeugende Knoten einen anderen Namespace (in dem Fall: keinen) hat. Deswegen auch das leere
<Receiver xmlns=""/>
Nimm stattdessen "createNode", denn hier kannst du den Namespace selbst angeben. Aber diesmal eben nur den Teil
in den Anführungszeichen:
Delphi-Quellcode:
if(root <> nil) then
begin
// neuen Knoten erzeugen und Namespace direkt angeben
node := xmldoc.createNode(NODE_ELEMENT,'Receiver',strNS);
root.appendChild(node);
end;
Der Parser ist clever genug und merkt, dass das der Haupt-Namespace der Datei ist. Deswegen lässt er die Angabe im Code später weg, obwohl der Namespace faktisch natürlich da ist.
Und damit sollte deine Datei eigentlich so aussehen, wie es gefordert wird:
Delphi-Quellcode:
// XML-Code anzeigen, & speichern
ShowMessage(xmldoc.xml);
xmldoc.save(ExtractFilePath(paramstr(0)) + '
test.xml');
// end of log :o)
finally
xmldoc :=
nil;
end;
end;
Ich hoffe, das hilft dir weiter.