Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

TreeView kopieren

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

ich habe einen TreeView:


Broker

-OrderTypes

--Exchange

---Limit

---usw.

ich suche nun eine Möglichkeit, wenn ich den Knoten Exchange makiere, dass er mir diesen, mit allen Unterknoten kopiert und unterhalb hinzufügt. Sprich, dass es dann so aussieht:

Broker

-OrderTypes

--Exchange

---Limit

---usw.

--Exchange

---Limit

---usw.

Das kopieren habe ich schon hinbekommen funktioniert auch soweit, bloß wie füge ich das ganz jetzt noch unterhalb ein?? Das Kopieren habe ich folgendermaßen gelöst:

XmlDocument doc = new XmlDocument();

doc.Load(AktuellGeladeneDatei.Text);

//ab markiertem Knoten kopieren

XmlNode root = doc.SelectSingleNode(markierterPfad.Text);

//Eine Kopie mit CloneNode erstellen

XmlNode deep = root.CloneNode(true);

tBXML.Text = deep.OuterXml;

Gibt es da eine Möglichkeit?

Ich hoffe mir kann jemand helfen.

Ein Beispiel wäre natürlich auch supi.

Danke schonmal!!

Müsste so in etwa aussehen:


' x = xmldocument

        x.LastChild.InsertAfter(DEINE_CLONENODE, x.LastChild.LastChild)

Beitrag #100 :)

Vielen dank für die schnelle Antwort!!

...hat super geklappt!

Jetzt habe ich nur noch folgedes Problem.

Ich habe das ganze jetzt wie folgt gelöst:


XmlDocument doc = new XmlDocument();

doc.Load(AktuellGeladeneDatei.Text);

XmlNode objRoot = doc.DocumentElement;

string strXmlQuery = markierterPfad.Text;

XmlNode objToBeCloned = objRoot.SelectSingleNode(strXmlQuery);

XmlNode objNewNode = objToBeCloned.CloneNode(true);

objRoot.InsertAfter(objNewNode, objRoot.LastChild);

doc.Save(AktuellGeladeneDatei.Text);

Meine Struktur sieht so aus:

BrokerDef

-Broker

--OrderTypes

---Exchange

----Limit

----Stop

----usw.

Ich kopiere nun den kompletten Exchange-Block. Aber das Programm fügt mir den kopierten Exchange-Block so ein:

BrokerDef

-Broker

--OrderTypes

---Exchange

----Limit

----Stop

----usw.

-Exchange

--Limit

--Stop

--usw.

Der kopierte Exchange-Block soll aber unter den ersten kommen.

Vll. kann mir da noch jemand helfen.

Wäre echt supi.

Danke schon mal!

Is ja kein Wunder wenn du es in Root kopierst ;)

objRoot.SelectSingleNode(strXmlQuery).parent (iwie so) müsste das Ziel sein.

objRoot.SelectSingleNode(strXmlQuery).parent

Ich glaube du hast mich etwas falsch verstanden. (bzw. hab ich mich vll. etwas falsch ausgedrückt:))

Wenn ich diese Zeile so änder, dann kopiert er mir nicht den markierten Knoten sondern den übergeordneten.

Ich versuch das Problem nochmal etwas deutlicher zu erklären.

Mein XML-Aufbau:


<BrokerDef>

  <Broker>

    <OrderTypes>

      <Exchange>

        <LIMIT>WERT</LIMIT>

        <STOP>WERT</STOP>

        <...>

      </Exchange>

    </OrderTypes>

  </Broker>

</BrokerDef>

Nun führe ich diesen Code aus:

XmlDocument doc = new XmlDocument();

doc.Load(AktuellGeladeneDatei.Text);

XmlNode objRoot = doc.DocumentElement;

string strXmlQuery = markierterPfad.Text;

XmlNode objToBeCloned = objRoot.SelectSingleNode(strXmlQuery);

XmlNode objNewNode = objToBeCloned.CloneNode(true);

objRoot.InsertAfter(objNewNode, objRoot.LastChild);

doc.Save(AktuellGeladeneDatei.Text);

Nun sollte es eigentlich so dastehen:

<BrokerDef>

  <Broker>

    <OrderTypes>

      <Exchange>

        <LIMIT>WERT</LIMIT>

        <STOP>WERT</STOP>

        <...>

      </Exchange>

      <Exchange>

        <LIMIT>WERT</LIMIT>

        <STOP>WERT</STOP>

        <...>

      </Exchange>

    </OrderTypes>

  </Broker>

</BrokerDef>

Aber im Moment wird es mir so ausgegeben:

<BrokerDef>

  <Broker>

    <OrderTypes>

      <Exchange>

        <LIMIT>WERT</LIMIT>

        <STOP>WERT</STOP>

        <...>

      </Exchange>

    </OrderTypes>

  </Broker>

  <Exchange>

    <LIMIT>WERT</LIMIT>

    <STOP>WERT</STOP>

    <...>

  </Exchange>

</BrokerDef>

Ich glaube das Problem liegt in dieser Zeile:

objRoot.InsertAfter(objNewNode, objRoot.LastChild);

da hier ja der Ort angegeben wird, wo das kopierte eingefügt werden soll.

Ich habe schon alle möglichen Kombinationen ausprobiert, aber keine funktioniert.

Ich hoffe jetzt ist mein Problem etwas klarer geworden.

Also...

objRoot.InsertAfter(objNewNode, objRoot.LastChild);

guck dir mal die Beschreibung von insertAfter an.

InsertAfter(newNode, refNode)

und refNode heisst soviel wie, füge es hinter refNode an.

Somit wäre dein Ziel objRoot.SelectSingleNode(strXmlQuery)

Danke für deinen Tipp! Hab es gleich ausprobiert.

Ich hab gestern noch 4 Stunden daran rumgebastel und gegoogelt

aber es klappt immernoch nicht:(

Die Methode sieht nun wie folgt aus:


XmlDocument doc = new XmlDocument();

doc.Load(AktuellGeladeneDatei.Text);

XmlNode objRoot = doc.DocumentElement;

string strXmlQuery = markierterPfad.Text;

XmlNode objToBeCloned = objRoot.SelectSingleNode(strXmlQuery);

XmlNode objNewNode = objToBeCloned.CloneNode(true);

objRoot.InsertAfter(objNewNode, objRoot.SelectSingleNode(strXmlQuery));

doc.Save(AktuellGeladeneDatei.Text);

Sobald ich diese ausführe, bekomme ich folgende Fehlermeldung:
Der Verweisknoten ist diesem Knoten nicht untergeordnet.

Kann mir vll. noch jemand helfen - bin am Verzweifeln:confused:

Danke schon mal!

Mach so:

objToBeCloned.ParentNode.AppendChild(objNewNode)

Vielen Vielen DANK für die Geduld mit mir!!!:uli:D

jetzt klappt es einwandfrei

DANKE!

Bearbeitet von Hexe145

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.