AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML appendchild/ Insertbefore

XML appendchild/ Insertbefore

Ein Thema von geldis · begonnen am 11. Aug 2022 · letzter Beitrag vom 12. Aug 2022
Antwort Antwort
geldis

Registriert seit: 19. Jan 2022
28 Beiträge
 
#1

XML appendchild/ Insertbefore

  Alt 11. Aug 2022, 09:07
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
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
96 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: XML appendchild/ Insertbefore

  Alt 11. Aug 2022, 10:25
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.

Geändert von shebang (11. Aug 2022 um 10:30 Uhr)
  Mit Zitat antworten Zitat
ManBu

Registriert seit: 4. Mär 2008
9 Beiträge
 
#3

AW: XML appendchild/ Insertbefore

  Alt 11. Aug 2022, 11:16
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
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
28 Beiträge
 
#4

AW: XML appendchild/ Insertbefore

  Alt 11. Aug 2022, 15:03
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

Geändert von geldis (11. Aug 2022 um 15:08 Uhr)
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
96 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: XML appendchild/ Insertbefore

  Alt 11. Aug 2022, 15:32
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.
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
28 Beiträge
 
#6

AW: XML appendchild/ Insertbefore

  Alt 11. Aug 2022, 15:51
Wird über den Namen angesprochen, sicher, kann auch gerne vor GUID sitzen, ich kriege es nicht hin.


geldis
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
96 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: XML appendchild/ Insertbefore

  Alt 12. Aug 2022, 09:05
Ein ItemKnoten.appendChild(NeuerKnoten) würde den neuen Knoten immer innerhalb von <Item> nach <Name> einfügen.
  Mit Zitat antworten Zitat
ManBu

Registriert seit: 4. Mär 2008
9 Beiträge
 
#8

AW: XML appendchild/ Insertbefore

  Alt 12. Aug 2022, 11:50
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)
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
28 Beiträge
 
#9

AW: XML appendchild/ Insertbefore

  Alt 12. Aug 2022, 17:45
@ManBu

Juppi! Ich werd' verrückt.

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

Ich bedanke mich ausührlich!

geldis
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:55 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