![]() |
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:
Soweit so gut.Oft gemacht.Immergeklappt.
ItemListe := CoDOMDocument.create;
ItemListe.Load(ItemFile); ItemListeRootNode := ItemListe.DocumentElement; ItemListeSingleNode := ItemListeRootNode.SelectSingleNode('//Asset[GUID="24053"]'); NewItemNode := ItemListe.CreateElement('Icon'); NewCreatedNode := ItemListeSingleNode.appendChild(NewItemNode); Das ist ein Knoten der XML und ich möchte eigntlich folgendes:
Code:
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.
<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> 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 |
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.
|
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 |
AW: XML appendchild/ Insertbefore
Also:
Code:
Das Stück hier zeigt wo der neue Knoten Icon hin soll.
<Item>
<GUID>1010296</GUID> --> <Icon>Sonstwas</Icon> <Name>Stahlwerk</Name> </Item> Wenn ich nun <Item> als Knoten via SelectSingleNode auswähle erhalte ich als Ausgabe jetzt den richtigen Knoten:
Code:
mit ....insertBefore(NeuerKnoten,ItemKnoten) bekomme ich 'Die Stelle zum Einfügen muss ein untergeordneterKnoten des Knotens sein, unter dem eingefügt werden soll.'
<Item>
<GUID>1010296</GUID> <Name>Stahlwerk</Name> </Item> Das raff ich nicht.
Code:
Was muss ich machen verdammt.
<?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> geldis |
AW: XML appendchild/ Insertbefore
Zitat:
Warum ist die Reihenfolge überhaupt wichtig? Die Knoten werden doch hoffentlich über ihren Namen angesprochen und nicht über ihre Position. |
AW: XML appendchild/ Insertbefore
Wird über den Namen angesprochen, sicher, kann auch gerne vor GUID sitzen, ich kriege es nicht hin.
geldis |
AW: XML appendchild/ Insertbefore
Ein
Delphi-Quellcode:
würde den neuen Knoten immer innerhalb von <Item> nach <Name> einfügen.
ItemKnoten.appendChild(NeuerKnoten)
|
AW: XML appendchild/ Insertbefore
Wenn du es an eine bestimmte Stelle einfügen musst:
Code:
Siehe dazu MSDN
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)); ![]() |
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 15:09 Uhr. |
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