Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi einige SubNodes an einen SubNode hängen (https://www.delphipraxis.net/151442-einige-subnodes-einen-subnode-haengen.html)

Piro 18. Mai 2010 10:33


einige SubNodes an einen SubNode hängen
 
Moin zusammen,

sorry für den Titel aber es ist mir nichts besseres eingefallen.

Ich möchte gerne folgende XML Datei erzeugen.

XML-Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<subsubitems>
  <column>
    <item_1>
      <visible>1</visible>
      <position>1</position>
      <width>120</width>
    </item_1>
    <item_2>
      <visible>1</visible>
      <position>1</position>
      <width>120</width>
    </item_2>
  </column>
</subsubitems>
Leider gelingt es mir nicht. Ich bekomme nur folgende Struktur hin.

XML-Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<subsubitems>
  <column>
    <item_1>
      <visible>1</visible>
      <position>1</position>
      <width>120</width>
    </item_1>
  </column>
  <column>
    <item_2>
      <visible>1</visible>
      <position>2</position>
      <width>240</width>
    </item_2>
  </column>
</subsubitems>
Dies ist mein Code.
Delphi-Quellcode:
...
ColumnName := 'item_1';
 xmlNode := xmlDoc.documentElement.selectSingleNode('/subsubitems/columns/'+ColumnName);
 if Assigned(xmlNode) then
 begin
   try
     xmlNode.selectSingleNode('visible').Text := '1';
     xmlNode.selectSingleNode('position').Text := '1';
     xmlNode.selectSingleNode('width').Text   := '120';
   except
     //
   end;
 end
 else
 begin
   NewItem := xmlDoc.createElement('column');
   NewItemSub := xmlDoc.createElement(ColumnName);

   NewSub := xmlDoc.createElement('visible');
   NewSub.text := '1';
   NewItemSub.appendChild(NewSub);

   NewSub := xmlDoc.createElement('position');
   NewSub.text := '1';
   NewItemSub.appendChild(NewSub);

   NewSub := xmlDoc.createElement('width');
   NewSub.text := '120';
   NewItemSub.appendChild(NewSub);

   NewItem.appendChild(NewItemSub);
   xmlDoc.documentElement.appendChild(NewItem);
 end;

 ColumnName := 'item_2';
 xmlNode := xmlDoc.documentElement.selectSingleNode('/subsubitems/columns/'+ColumnName);
 if Assigned(xmlNode) then
 begin
   try
     xmlNode.selectSingleNode('visible').Text := '2';
     xmlNode.selectSingleNode('position').Text := '2';
     xmlNode.selectSingleNode('width').Text   := '240';
   except
     //
   end;
 end
 else
 begin
   NewItem := xmlDoc.createElement('column');
   NewItemSub := xmlDoc.createElement(ColumnName);

   NewSub := xmlDoc.createElement('visible');
   NewSub.text := '2';
   NewItemSub.appendChild(NewSub);

   NewSub := xmlDoc.createElement('position');
   NewSub.text := '2';
   NewItemSub.appendChild(NewSub);

   NewSub := xmlDoc.createElement('width');
   NewSub.text := '240';
   NewItemSub.appendChild(NewSub);

   NewItem.appendChild(NewItemSub);
   xmlDoc.documentElement.appendChild(NewItem);
 end;

 xmlDoc.save(AppPath + XML_FNAME);
Wie muss ich meinen Code ändern, dass ich die 1. Struktur bekomme? Ich habe schon ne Menge probiert aber leider ohne Erfolg.

Vielen Dank im voraus.

Sven

himitsu 18. Mai 2010 10:40

Re: einige SubNodes an einen SubNode hängen
 
.documentElement ist das Root-Item (wovon es übrigend eh nur eines geben kann) und entspricht somit schon deinem Root-Item "subsubitems"

versuch mal dieses:
Delphi-Quellcode:
xmlNode := xmlDoc.documentElement.selectSingleNode('columns/'+ColumnName);

Piro 18. Mai 2010 10:58

Re: einige SubNodes an einen SubNode hängen
 
Danke für den Tipp. Habe ich geändert. Es hat sich leider nichts geändert.

Was nun?

himitsu 18. Mai 2010 11:09

Re: einige SubNodes an einen SubNode hängen
 
Ohhh ... hmmmmm, mal überlegen. :gruebel:
Tja, dann wirst du dich wohl mal fragen müssen, warum der Node immernoch nicht gefunden wird?

Mal sehn, wem was auffällt. :stupid:
XML-Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<subsubitems>
  <column>
    <item_1>
Code:
[color=blue]//xmlNode := xmlDoc.documentElement.selectSingleNode('/subsubitems/column[/color][color=red]s[/color][color=blue]/'+ColumnName);[/color]
xmlNode := xmlDoc.documentElement.selectSingleNode('column[color=red]s[/color]/'+ColumnName);

Piro 18. Mai 2010 11:55

Re: einige SubNodes an einen SubNode hängen
 
Ah..ok, dass war ein Tippfehler.

Trotzdem habe ich immer noch die 1. Struktur. Der Fehler wäre auch nur relevant bei Daten, die schon vorhanden sind.
Wenn ich aber alles neuanlege, soll ja schon die richtige Struktur erstellt werden. Also nur das Erstellen ist in ertser Linie interessant.

So soll es aussehen:
XML-Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<subsubitems>
  <columns>
    <item_1>
      <visible>1</visible>
      <position>1</position>
      <width>120</width>
    </item_1>
    <item_2>
      <visible>1</visible>
      <position>1</position>
      <width>120</width>
    </item_2>
  </columns>
</subsubitems>
Nur ein Columns Knoten, welcher dann aller Column Werte (z.B. item_1) enthält.

Danke schon mal.

himitsu 18. Mai 2010 12:17

Re: einige SubNodes an einen SubNode hängen
 
OK, dann sollte man auch nicht jedesmal 'columns' neu erstellen. :lol:
Delphi-Quellcode:
procedure SetItem(ColumnName: String; Visible: Boolean; Position, Width: Integer);
...
begin
  xmlColNode := xmlDoc.documentElement.selectSingleNode('columns');
  if not Assigned(xmlColNode) then
  begin
     xmlColNode := xmlDoc.createElement('column');
     xmlDoc.documentElement.appendChild(xmlColNode);
  end;
  xmlNode := xmlColNode.selectSingleNode(ColumnName);
  if Assigned(xmlNode) then
  begin
    xmlNode.selectSingleNode('visible').Text := Visible;
    xmlNode.selectSingleNode('position').Text := Position;
    xmlNode.selectSingleNode('width').Text   := Width;
  end
  else
  begin
    xmlNode := xmlDoc.createElement(ColumnName);
    xmlColNode.appendChild(xmlNode);

    NewSub := xmlDoc.createElement('visible');
    NewSub.text := Visible;
    xmlNode.appendChild(NewSub);

    NewSub := xmlDoc.createElement('position');
    NewSub.text := Position;
    xmlNode.appendChild(NewSub);

    NewSub := xmlDoc.createElement('width');
    NewSub.text := Width;
    xmlNode.appendChild(NewSub);
  end;
end;
und wenn du ganz auf Nummer sichergehn willst, dann:
(eine leere Try-Except-Behandlung ist nicht sonderlich schön)
Delphi-Quellcode:
procedure SetItem(ColumnName: String; Visible: Boolean; Position, Width: Integer);
...
begin
  xmlColNode := xmlDoc.documentElement.selectSingleNode('columns');
  if not Assigned(xmlColNode) then
  begin
     xmlColNode := xmlDoc.createElement('column');
     xmlDoc.documentElement.appendChild(xmlColNode);
  end;

  xmlNode := xmlColNode.selectSingleNode(ColumnName);
  if not Assigned(xmlNode) then
  begin
    xmlNode := xmlDoc.createElement(ColumnName);
    xmlColNode.appendChild(xmlNode);
  end;

  xmlSubNode := xmlNode.selectSingleNode('visible');
  if not Assigned(xmlSubNode) then
  begin
    xmlSubNode:= xmlDoc.createElement('visible');
    xmlNode.appendChild(xmlSubNode);
  end;
  xmlSubNode.Text := Visible;

  xmlSubNode := xmlNode.selectSingleNode('position');
  if not Assigned(xmlSubNode) then
  begin
    xmlSubNode:= xmlDoc.createElement('position');
    xmlNode.appendChild(xmlSubNode);
  end;
  xmlSubNode.Text := Position;

  xmlSubNode := xmlNode.selectSingleNode('width');
  if not Assigned(xmlSubNode) then
  begin
    xmlSubNode:= xmlDoc.createElement('width');
    xmlNode.appendChild(xmlSubNode);
  end;
  xmlSubNode.Text := Width;
end;
(jetzt weiß ich wieder, warum ich MSXML nicht mag :angel2: ... Unmassen Zeilen an Code, wo doch 3 Zeilen gereicht hätten)

Piro 18. Mai 2010 13:07

Re: einige SubNodes an einen SubNode hängen
 
Vielen Dank. Hat geklappt. Irgendwie hast du recht. Viele Code für wenig Aktion.

Danke nochmal.

himitsu 18. Mai 2010 14:14

Re: einige SubNodes an einen SubNode hängen
 
gern geschen :-D


himXML mit standardmäßig aktivem AutoNodeCreate ( *überleg* hat MSXML vielleicht auch sowas in den Optionen? )
Delphi-Quellcode:
xmlDoc['columns\item_1\visible'].Text := 1;
xmlDoc['columns\item_1\position'].Text := 1;
xmlDoc['columns\item_1\width'].Text   := 120;
oder
Delphi-Quellcode:
with xmlDoc['columns\item_1'] do begin
  Node['visible'].Text := 1;
  Node['position'].Text := 1;
  Node['width'].Text   := 120;
end;
Einige andere XML-Libs sollten sowas auch hinbekommen. :angel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 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