AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi einige SubNodes an einen SubNode hängen
Thema durchsuchen
Ansicht
Themen-Optionen

einige SubNodes an einen SubNode hängen

Ein Thema von Piro · begonnen am 18. Mai 2010 · letzter Beitrag vom 18. Mai 2010
Antwort Antwort
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 10:33
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#2

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 10:40
.documentElement ist das Root-Item (wovon es übrigend eh nur eines geben kann) und entspricht somit schon deinem Root-Item "subsubitems"

versuch mal dieses:
xmlNode := xmlDoc.documentElement.selectSingleNode('columns/'+ColumnName);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#3

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 10:58
Danke für den Tipp. Habe ich geändert. Es hat sich leider nichts geändert.

Was nun?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#4

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 11:09
Ohhh ... hmmmmm, mal überlegen.
Tja, dann wirst du dich wohl mal fragen müssen, warum der Node immernoch nicht gefunden wird?

Mal sehn, wem was auffällt.
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#5

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 11:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#6

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 12:17
OK, dann sollte man auch nicht jedesmal 'columns' neu erstellen.
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 ... Unmassen Zeilen an Code, wo doch 3 Zeilen gereicht hätten)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#7

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 13:07
Vielen Dank. Hat geklappt. Irgendwie hast du recht. Viele Code für wenig Aktion.

Danke nochmal.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#8

Re: einige SubNodes an einen SubNode hängen

  Alt 18. Mai 2010, 14:14
gern geschen


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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 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