Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML appendchild/ Insertbefore (https://www.delphipraxis.net/211193-xml-appendchild-insertbefore.html)

geldis 11. Aug 2022 08:07

XML appendchild/ Insertbefore
 
Moin Moin.
Ich murkse mich seit Ewigkeiten mit der Methode insertBefore für XML ab.

Also : Folgender Code würde ein neues Element an das Ende des unten gezeigten Schnipsels einer XML.
Delphi-Quellcode:
  ItemListe := CoDOMDocument.create;
  ItemListe.Load(ItemFile);
  ItemListeRootNode := ItemListe.DocumentElement;
  ItemListeSingleNode := ItemListeRootNode.SelectSingleNode('//Asset[GUID="24053"]');
  NewItemNode    := ItemListe.CreateElement('Icon');
  NewCreatedNode := ItemListeSingleNode.appendChild(NewItemNode);
Soweit so gut.Oft gemacht.Immergeklappt.

Das ist ein Knoten der XML und ich möchte eigntlich folgendes:
Code:
<Asset>
  <Template>ItemEffectTargetPool</Template>
   <Values>
    <Standard>
     <GUID>24053</GUID>
     <Name>alle Gebäude der Schwerindustrie</Name>
[COLOR="SeaGreen"]--> hier soll der neue Knoten hin[/COLOR]
    </Standard>
    <ItemEffectTargetPool>
     <EffectTargetGUIDs>
      <Item>
       <GUID>1010296</GUID>
       <Name>Stahlwerk</Name>
[COLOR="SeaGreen"]--> hier soll auch ein neuer Knoten hin[/COLOR]                        
      </Item>
      <Item>
       <GUID>1010297</GUID>
       <Name>Hochofen</Name>
[COLOR="SeaGreen"]--> hier soll ebenso ein neuer Knoten hin[/COLOR]
      </Item>
     </EffectTargetGUIDs>
    </ItemEffectTargetPool>
  </Values>
</Asset>
Und da ist die Angabe der Position an der der neue Knoten gesetzt werden soll mein Problem. insertbefore will den Namen des neuen Knotens und natürlich die Position des Knotens vor den der neue gesetzt werden soll.
Was habe ich jetzt alles durch. SelectSingleNode zum Beispiel. Aber nee.
Fehlermeldung: "Der Knoten muss ein neuer Knoten des übergeordneten Nebenunterknotens des berühmten Hauptknotens der Unterknoten sein'. Oder so ähnlich. Mir fällt nichts mehr ein.

Hat jemand eine Ahnung?


geldis

shebang 11. Aug 2022 09:25

AW: XML appendchild/ Insertbefore
 
Wenn der neue Knoten wirklich innerhalb von <Item> und nach <Name> eingefügt werden soll, dann reicht es doch aus ein appendChild mit <Item> als Referenz durchzuführen. insertBefore macht nur Sinn, wenn nach dem neuen Knoten auf der selben Ebene noch ein weiterer Knoten existiert.

ManBu 11. Aug 2022 10:16

AW: XML appendchild/ Insertbefore
 
Hi,

soweit ich dich verstanden habe willst du immer an einen Knoten (muss scheinbar nicht immer Item sein) mit einem Kind-Element GUID XYZ einen Knoten hinzufügen.

Dein X-Path-Ausdruck müsste dann so sein:
//*[GUID=1010296]

Damit erhältst du den Parent und kannst einfach mit AppendChild arbeiten

geldis 11. Aug 2022 14:03

AW: XML appendchild/ Insertbefore
 
Also:
Code:
      <Item>
       <GUID>1010296</GUID>
-->   <Icon>Sonstwas</Icon>
       <Name>Stahlwerk</Name>
      </Item>
Das Stück hier zeigt wo der neue Knoten Icon hin soll.

Wenn ich nun <Item> als Knoten via SelectSingleNode auswähle erhalte ich als Ausgabe jetzt den richtigen Knoten:

Code:
      <Item>
       <GUID>1010296</GUID>
       <Name>Stahlwerk</Name>
      </Item>
mit ....insertBefore(NeuerKnoten,ItemKnoten) bekomme ich 'Die Stelle zum Einfügen muss ein untergeordneterKnoten des Knotens sein, unter dem eingefügt werden soll.'

Das raff ich nicht.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<AssetList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Asset>
   <Template>ItemEffectTargetPool</Template>
      <Values>
         <Standard>
            <GUID>24053</GUID>
            <Name>alle Gebäude der Schwerindustrie</Name>
         </Standard>
      <ItemEffectTargetPool>
         <EffectTargetGUIDs>
            <Item>
               <GUID>1010296</GUID>
               davor --->         <Name>Stahlwerk</Name>
            </Item>
            <Item>
               <GUID>1010297</GUID>
               <Name>Hochofen</Name>
            </Item>
         </EffectTargetGUIDs>
      </ItemEffectTargetPool>
      </Values>
   </Asset>
</AssetList>
Was muss ich machen verdammt.

geldis

shebang 11. Aug 2022 14:32

AW: XML appendchild/ Insertbefore
 
Zitat:

Zitat von geldis (Beitrag 1510033)
Wenn ich nun <Item> als Knoten via SelectSingleNode auswähle erhalte ich als Ausgabe jetzt den richtigen Knoten:
Code:
      <Item>
       <GUID>1010296</GUID>
       <Name>Stahlwerk</Name>
      </Item>
mit ....insertBefore(NeuerKnoten,ItemKnoten) bekomme ich 'Die Stelle zum Einfügen muss ein untergeordneterKnoten des Knotens sein, unter dem eingefügt werden soll.'

Das raff ich nicht.

Wenn du den neuen Knoten vor <Name> einfügen möchtest, dann musst du diesen im insertBefore natürlich auch angeben und nicht <Item>.
Warum ist die Reihenfolge überhaupt wichtig? Die Knoten werden doch hoffentlich über ihren Namen angesprochen und nicht über ihre Position.

geldis 11. Aug 2022 14:51

AW: XML appendchild/ Insertbefore
 
Wird über den Namen angesprochen, sicher, kann auch gerne vor GUID sitzen, ich kriege es nicht hin.


geldis

shebang 12. Aug 2022 08:05

AW: XML appendchild/ Insertbefore
 
Ein
Delphi-Quellcode:
ItemKnoten.appendChild(NeuerKnoten)
würde den neuen Knoten immer innerhalb von <Item> nach <Name> einfügen.

ManBu 12. Aug 2022 10:50

AW: XML appendchild/ Insertbefore
 
Wenn du es an eine bestimmte Stelle einfügen musst:

Code:
  ItemListe := CoDOMDocument.create;
  ItemListe.Load(ItemFile);
  ItemListeRootNode := ItemListe.DocumentElement;
  ItemListeSingleNode := ItemListeRootNode.SelectSingleNode('//Asset[GUID="24053"]');
  NewItemNode := ItemListe.CreateElement('Icon');
  NewCreatedNode := ItemListeSingleNode.insertBefore(NewItemNode, ItemListeSingleNode.childNodes.item(1));
Siehe dazu MSDN https://docs.microsoft.com/en-us/pre...54519(v=vs.85)

geldis 12. Aug 2022 16:45

AW: XML appendchild/ Insertbefore
 
@ManBu

Juppi! Ich werd' verrückt. :shock:

Jetzt habe ich das begriffen. Man ist ja manchmal so borniert.....

Ich bedanke mich ausührlich! :thumb:

geldis


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