Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: Problem bei XML-Erstellung / Schemenangabe

  Alt 27. Okt 2004, 07:28
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.
  Mit Zitat antworten Zitat