Hexe145 Geschrieben 20. April 2009 Geschrieben 20. April 2009 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!! Zitieren
DominikJ Geschrieben 20. April 2009 Geschrieben 20. April 2009 Müsste so in etwa aussehen: ' x = xmldocument x.LastChild.InsertAfter(DEINE_CLONENODE, x.LastChild.LastChild) Beitrag #100 Zitieren
Hexe145 Geschrieben 20. April 2009 Autor Geschrieben 20. April 2009 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! Zitieren
DominikJ Geschrieben 20. April 2009 Geschrieben 20. April 2009 Is ja kein Wunder wenn du es in Root kopierst objRoot.SelectSingleNode(strXmlQuery).parent (iwie so) müsste das Ziel sein. Zitieren
Hexe145 Geschrieben 20. April 2009 Autor Geschrieben 20. April 2009 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. Zitieren
DominikJ Geschrieben 20. April 2009 Geschrieben 20. April 2009 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) Zitieren
Hexe145 Geschrieben 21. April 2009 Autor Geschrieben 21. April 2009 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! Zitieren
DominikJ Geschrieben 21. April 2009 Geschrieben 21. April 2009 Mach so: objToBeCloned.ParentNode.AppendChild(objNewNode) Zitieren
Hexe145 Geschrieben 21. April 2009 Autor Geschrieben 21. April 2009 (bearbeitet) Vielen Vielen DANK für die Geduld mit mir!!!:uli:D jetzt klappt es einwandfrei DANKE! Bearbeitet 21. April 2009 von Hexe145 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.