Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Verschachtelte XML Datei schreiben (https://www.delphipraxis.net/82539-verschachtelte-xml-datei-schreiben.html)

Luckie 15. Dez 2006 10:28


Verschachtelte XML Datei schreiben
 
Ich habe folgende XML-Datei
XML-Code:
 <?xml version="1.0" encoding="ISO-8859-1"?>
<root>
  <layers>
    <layer>
      <posx>44</posx>
      <posy>96</posy>
      <width>160</width>
      <height>128</height>
      <image>1.bmp</image>
    </layer>
    <layer>
      <posx>359</posx>
      <posy>94</posy>
      <width>160</width>
      <height>128</height>
      <image>2.bmp</image>
    </layer>
    <layer>
      <posx>202</posx>
      <posy>277</posy>
      <width>160</width>
      <height>227</height>
      <image>3.bmp</image>
    </layer>
  </layers>

  <textobjects>
    <textobject>
      <posx>232</posx>
      <posy>153</posy>
      <width>95</width>
      <height>22</height>
      <text>ewfkerfmerlmf</text>
    </textobject>
    <textobject>
      <posx>208</posx>
      <posy>527</posy>
      <width>162</width>
      <height>41</height>
      <text>svmdfklmvortjgotr058690356u045fkdnbgkl</text>
    </textobject>
  </textobjects>
</root>
Und die will ich jetzt auch schreiben.

Aber ich bekomme es einfach nicht hin, dass die layer Knoten im Knoten layers stehen:

Delphi-Quellcode:
procedure TForm2.btnSaveLayersClick(Sender: TObject);

  function createElement(const xmldoc: DomDocument; parentNode: IXMLDOMNode; szNodeName, szNodeValue: string): boolean;
  var
    node           : IXMLDOMNode;
  begin
    Result := false;
    if (xmldoc = nil) or (szNodeName = '') then
      exit;

    node := xmldoc.createElement(szNodeName);
    Result := node <> nil;

    if (node <> nil) then
    begin
      if (szNodeValue <> '') then
        node.text := szNodeValue;
      if (parentNode <> nil) then
        parentNode.appendChild(node)
      else
        xmldoc.documentElement.appendChild(node);
    end;
  end;

var
  XMLFile          : string;
  XMLDoc           : DomDocument;
  XMLLayers        : IXMLDOMNode;
  XMLNode          : IXMLDOMNode;
  i                : Integer;
begin
  XMLDoc := CoDOMDocument.Create;

  XMLDoc.loadXML('<?xml version="1.0" encoding="ISO-8859-1"?><root/>');

  XMLLayers := XMLDoc.createElement('layers');
  XMLDoc.documentElement.appendChild(XMLLayers);

  with ImageEnVect1 do
  begin
    for i := 1 to LayersCount - 1 do
    begin
      XMLNode := XMLDoc.createElement('layer');
      XMLDoc.documentElement.appendChild(XMLNode);
      createElement(XmlDoc, XMLNode, 'posx', IntToStr(Layers[i].PosX));
      XMLDoc.documentElement.appendChild(XMLNode);
    end;
  end;

  XMLFile := ExtractFilePath(ParamStr(0)) + ' Text.xml';
  XMLDoc.save(XMLFile);
end;

xaromz 15. Dez 2006 10:31

Re: Verschachtelte XML Datei schreiben
 
Hallo,

hier ist Dein Fehler:
Delphi-Quellcode:
with ImageEnVect1 do
  begin
    for i := 1 to LayersCount - 1 do
    begin
      XMLNode := XMLDoc.createElement('layer');

      // Falsch: XMLDoc.documentElement.appendChild(XMLNode);
      // Richtig:
      XMLLayers.appendChild(XMLNode);

      createElement(XmlDoc, XMLNode, 'posx', IntToStr(Layers[i].PosX));

      // Hier nochmal, Du musst das richtige Parent setzen
      XMLDoc.documentElement.appendChild(XMLNode);
    end;
  end;
Du musst den Unterknoten dem richtigen Parent hinzufügen.


Gruß
xaromz

Luckie 15. Dez 2006 10:36

Re: Verschachtelte XML Datei schreiben
 
Ächtz :wall:. Danke. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz