Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi (unbekannte) XML Dateien zusammenführen bzw. mergen (https://www.delphipraxis.net/140616-unbekannte-xml-dateien-zusammenfuehren-bzw-mergen.html)

himitsu 23. Sep 2009 18:08

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
also dann das löschen so :)
Delphi-Quellcode:
for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
  NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);

padavan 24. Sep 2009 05:29

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
wenn, dann so

Delphi-Quellcode:
      for i2 := 0 to NodeAnother.childNodes.length - 1 do
        NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[i2]);   //0
Bringt aber beim letzten Durchlauf immer: "Kein untergeordneter Knoten"

Ich brech noch ab

himitsu 24. Sep 2009 07:09

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
ups, immer diese Indize beim Copy&Paste :oops:

Code:
[color=#0000AF][b]for[/b][/color] i2 := 0 [color=#0000AF][b]to[/b][/color] NodeBase.childNodes[i].childNodes.length - 1 [color=#0000AF][b]do[/b][/color]
  NodeBase.childNodes[i].removeChild(NodeBase.childNodes[[b]i2[/b]].[b]firstChild[/b]);
oder? :gruebel:
Code:
NodeBase.childNodes[i].[b]firstChild[/b].removeChild(NodeBase.childNodes[[b]i2[/b]].[b]firstChild[/b]);

Delphi-Quellcode:
while Assigned(NodeAnother) do
  begin
    NodeNext := NodeAnother.NextSibling;
    i := 0;
    while (i < NodeBase.childNodes.length)
        and (NodeBase.childNodes[i].firstChild.text
          <> NodeAnother.firstChild.text) do
      Inc(i);
    if i < NodeBase.childNodes.length then
    begin
      for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
        NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i2].firstChild);
      for i2 := 0 to NodeAnother.childNodes.length - 1 do
        NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[0]);
    end else
      NodeBase.appendChild(NodeAnother);
    NodeAnother := NodeNext;
  end;

padavan 24. Sep 2009 07:25

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das bringt leider immernoch -> siehe Anhang

wenn ich es so probiere
Delphi-Quellcode:
      while NodeBase.childNodes[i].childNodes.length > 0 do
        NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);
klappt das zwar, aber im nächsten Durchlauf bei
Delphi-Quellcode:
  while Assigned(NodeAnother) do
  begin
    NodeNext := NodeAnother.NextSibling;
    i := 0;
    while (i < NodeBase.childNodes.length)               <<<<<Access Violation
        and (NodeBase.childNodes[i].firstChild.text
          <> NodeAnother.firstChild.text) do
      Inc(i);
    if i >= NodeBase.childNodes.length then
    ...
knallt´s.

padavan 24. Sep 2009 07:31

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
Ha!

So geht´s

Delphi-Quellcode:
  while Assigned(NodeAnother) do
    begin
      NodeNext := NodeAnother.NextSibling;
      i := 0;
      while (i < NodeBase.childNodes.length)
          and (NodeBase.childNodes[i].firstChild.text
            <> NodeAnother.firstChild.text) do
        Inc(i);
      if i < NodeBase.childNodes.length then
      begin

        while NodeBase.childNodes[i].childNodes.length > 0 do
          NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);

        for i2 := 0 to NodeAnother.childNodes.length - 1 do
          NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[0]);

      end else
        NodeBase.appendChild(NodeAnother);

      NodeAnother := NodeNext;
    end;
:dancer:

(jetzt muss ich erst mal gut durchtesten, nachdem ich die Euphorie gelegt hat)

himitsu 24. Sep 2009 07:35

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
menno, der Index war doch richtig -.-°

also eigentlich müßte es doch so funktionieren :gruebel:
Delphi-Quellcode:
while Assigned(NodeAnother) do
  begin
    NodeNext := NodeAnother.NextSibling;
    i := 0;
    while (i < NodeBase.childNodes.length)
        and (NodeBase.childNodes[i].firstChild.text
          <> NodeAnother.firstChild.text) do
      Inc(i);
    if i < NodeBase.childNodes.length then
    begin
      for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
        NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);
      for i2 := 0 to NodeAnother.childNodes.length - 1 do
        NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[0]);
    end else
      NodeBase.appendChild(NodeAnother);
    NodeAnother := NodeNext;
  end;
[edit]
Zitat:

So geht´s
also ob While oder For-Do sollte egal sein, abgesehn davon, daß bei For-Do nur einmal die Anzahl abgefragt wird.

[add]
ach ja, warum da die Exception kommt ...
Delphi-Quellcode:
(NodeBase.childNodes[i].firstChild.text <> NodeAnother.firstChild.text)
hier ist keine Prüfung eingebaut, ob es überhaupt je mindestens einen ChildNode gibt, bevor drauf zugegriffen wird.

padavan 24. Sep 2009 08:17

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
stimmt.

Delphi-Quellcode:
if NodeAnother.childNodes[i].hasChildNodes = true then
so geht´s aber leider schon mal nicht

himitsu 24. Sep 2009 08:26

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
eventuell so?
Delphi-Quellcode:
while Assigned(NodeAnother) do
begin
  NodeNext := NodeAnother.NextSibling;
  i := 0;
  while (i < NodeBase.childNodes.length)
      and (mot Assigned(NodeBase.childNodes[i].firstChild)
        or not Assigned(NodeAnother.firstChild)
        or (NodeBase.childNodes[i].firstChild)
          <> NodeAnother.firstChild.text)) do
    Inc(i);
  if i < NodeBase.childNodes.length then
  begin
    for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
      NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);
    for i2 := 0 to NodeAnother.childNodes.length - 1 do
      NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[0]);
  end else
    NodeBase.appendChild(NodeAnother);
  NodeAnother := NodeNext;
end;
[edit]
ups ... noch schnell ein paar NOT einbauen

padavan 24. Sep 2009 10:08

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
Delphi-Quellcode:
while Assigned(NodeAnother) do
begin
  NodeNext := NodeAnother.NextSibling;
  i := 0;
  while (i < NodeBase.childNodes.length)
      and (not Assigned(NodeBase.childNodes[i].firstChild)
        or not Assigned(NodeAnother.firstChild)
        or (NodeBase.childNodes[i].firstChild)
          <> NodeAnother.firstChild.text)) do     //<<<< operator not applicable to this operand type
    Inc(i);
  if i < NodeBase.childNodes.length then
  begin
    for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
      NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild); // <<<< wo kommt i2 rein?
    for i2 := 0 to NodeAnother.childNodes.length - 1 do
      NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[0]); // <<<< wo kommt i2 rein?
  end else
    NodeBase.appendChild(NodeAnother);
  NodeAnother := NodeNext;
end;

himitsu 24. Sep 2009 10:25

Re: (unbekannte) XML Dateien zusammenführen bzw. mergen
 
Zitat:

/<<<< operator not applicable to this operand
da hatte ich einfach nur etwas zuviel gelöscht :oops:

Delphi-Quellcode:
while Assigned(NodeAnother) do
begin
  NodeNext := NodeAnother.NextSibling;
  i := 0;
  while (i < NodeBase.childNodes.length)
      and (not Assigned(NodeBase.childNodes[i].firstChild)
        or not Assigned(NodeAnother.firstChild)
        or (NodeBase.childNodes[i].firstChild.text
          <> NodeAnother.firstChild.text)) do
    Inc(i);
  if i < NodeBase.childNodes.length then
  begin
    for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
      NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);
    for i2 := 0 to NodeAnother.childNodes.length - 1 do
      NodeBase.childNodes[i].appendChild(NodeAnother.firstChild);
  end else
    NodeBase.appendChild(NodeAnother);
  NodeAnother := NodeNext;
end;

Zitat:

<<<< wo kommt i2 rein?
garnicht?

es wird einfach immer nur i2-mal der erste Node gelöscht oder übertragen
Delphi-Quellcode:
begin
  for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
    NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].firstChild);
  for i2 := 0 to NodeAnother.childNodes.length - 1 do
    NodeBase.childNodes[i].appendChild(NodeAnother.firstChild);
end else
oder
Delphi-Quellcode:
begin
  for i2 := 0 to NodeBase.childNodes[i].childNodes.length - 1 do
    NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].childNodes[0]);
  for i2 := 0 to NodeAnother.childNodes.length - 1 do
    NodeBase.childNodes[i].appendChild(NodeAnother.childNodes[0]);
end else
OK, man kann, zumindestens beim Löschen, den Index i2 verwenden,
Delphi-Quellcode:
for i2 := NodeBase.childNodes[i].childNodes.length - 1 downto 0 do
  NodeBase.childNodes[i].removeChild(NodeBase.childNodes[i].childNodes[i2]);
muß man aber nicht, da eh alles gelöscht werden soll.
Und ob man da von hinten oder vorne anfängt ist hier relativ egal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.
Seite 2 von 3     12 3      

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