Element in ner Xml File ersetzen

sorry das ich schon wieder fragen muss.
Ich habs erfolgreich fertig gebracht einen Wert aus einem Element mit nem bestimmten Attribut auszulesen. jetzt arbeite ich gerade an einer schreibmethode
um einzelne werte zu editieren und zu speichern. Hab mich mal etwas an ReplaceChild versucht. Das Problem ist meine Childelemente die Werte beinhalten heißen alle und werden durch ihre Attribute unterschieden. gibts da ne möglichkeit ein ganz bestimmtes ChildElement in ner Xml Stuktur zu ersetzen.

Speichern geht glaub ich mit save und dann nen xmltextwriter angeben oder?
sorry für die vielen fragen und danke für antworten

hi st@tic,

Das Problem ist meine
Childelemente die Werte beinhalten heißen alle
und werden durch ihre Attribute unterschieden.

XPath rules!
verwende: node.SelectSingleNode("./value[@attr = ‚hrzlmbrmft‘])

…damit bekommst du alle 1st level value-kinder mit dem attibut attr UND attributwert hrzlmbrmft…

gibts da ne
möglichkeit ein ganz bestimmtes ChildElement in ner Xml
Stuktur zu ersetzen.

womit?

Speichern geht glaub ich mit save und dann nen xmltextwriter
angeben oder?

willst du ‚nur‘ das XmlDocument ändern oder das ganze auch auf platte schreiben?

es hat da am XmlDocument (= xDoc) sowas wie xDoc.OuterXml das ist vom typ string, und wenn du sowas speichern kannst…

sorry für die vielen fragen und danke für antworten

schon ok…

tipp1: besorg dir den xmlspy (evaluation vers, läuft 30 tage), dort hats ein menu ‚EvaluateXPath‘, damit kannst du dir an beliebigen XmlDocumenten das ergebnis von deinem xpath-ausdruck anschauen…

tipp2: ich habe am liebsten www.zvon.org, dort findest du nicht nur für den ganzen XML/XPath/SOAP/SVG kram eine gut gelistete referenz, die haben sogar ein online lab, wo du ausprobieren kannst…(ich gehe davon aus, dass du alle standards vom w3c sowieso im schlaf herbeten kannst :wink:

XPath rules!
verwende: node.SelectSingleNode("./value[@attr =
‚hrzlmbrmft‘])

Also das hab ich schon selbst herrausgefunden, da ich das ja zum auslesen gebraucht hab

gibts da ne
möglichkeit ein ganz bestimmtes ChildElement in ner Xml
Stuktur zu ersetzen.

ok kurze erklärung mein dokument sieht so aus:

Wertwertwert

ich möchte diese struktur zum speichern von einstellungen und anderem krempel benutzen. auslesen geht, aber was ist wenn ich die datei verändern also aus Wert -> neuerWert machen will und diese dann wieder in ne xml File speichern. Später soll noch lösen und hinzufügen dazukommen aber das wird ja dann so ähnlich ablaufen *gg*

willst du ‚nur‘ das XmlDocument ändern oder das ganze auch auf
platte schreiben?

Platte schreiben

es hat da am XmlDocument (= xDoc) sowas wie xDoc.OuterXml das
ist vom typ string, und wenn du sowas speichern kannst…

inner und outerxml kenn ich auch schon. hab innerxml zumindest beim auslesen benötigt.

tipp1: besorg dir den xmlspy (evaluation vers, läuft 30 tage),
dort hats ein menu ‚EvaluateXPath‘, damit kannst du dir an
beliebigen XmlDocumenten das ergebnis von deinem
xpath-ausdruck anschauen…

ich nutze VisualXPath fürs Visual Studio :smile:

tipp2: ich habe am liebsten www.zvon.org, dort findest du
nicht nur für den ganzen XML/XPath/SOAP/SVG kram eine gut
gelistete referenz, die haben sogar ein online lab, wo du
ausprobieren kannst…(ich gehe davon aus, dass du alle
standards vom w3c sowieso im schlaf herbeten kannst :wink:

den zweiten tipp schau ich mir mal an.

XPath rules!
verwende: node.SelectSingleNode("./value[@attr =
‚hrzlmbrmft‘])

Also das hab ich schon selbst herrausgefunden, da ich das ja
zum auslesen gebraucht hab

ok, coole sache, offensichtlich haben wir ein kommunikationsproblem…ich dachte, dass schon der zuigriff auf das bestimnmte elemnt problematisch sei, so hatte ich deine kommentare verstanden…

gibts da ne
möglichkeit ein ganz bestimmtes ChildElement in ner Xml
Stuktur zu ersetzen.

du hast das alte element (über xpath oder von obi…): xOld

du legst das neue xmlelement xNew an:

xNew = xOld.OwnerDocument.CreateElement(„neuesElement“)
xOld.ParentNode.ReplaceChild(xOld, xNew);

you want attributes?:
xNew.Attributes.Add(…)…

egal wie dein doc aussieht, damit sollte es gehen; bei dem was du allertdings schon selber herausgefunden hast frage ich mich, warum du auf obigen zweizeiler (noch) nicht selbst gekommen bist…keine kritik, aber es ist schwer dein wissen hier einzuschätzen…

ok kurze erklärung mein dokument sieht so aus:

Wert
wert
wert

ich möchte diese struktur zum speichern von einstellungen und
anderem krempel benutzen. auslesen geht, aber was ist wenn ich
die datei verändern also aus Wert -> neuerWert machen will

s.o.

und diese dann wieder in ne xml File speichern. Später soll
noch lösen und hinzufügen dazukommen aber das wird ja dann so
ähnlich ablaufen *gg*

genau.

mit dem grundschema von oben kannst du kreuz & quer durchs xDoc und elemente/attribute löschen, hinzufügen, verändern…oder?

willst du ‚nur‘ das XmlDocument ändern oder das ganze auch auf
platte schreiben?

Platte schreiben

hm, kennst du Path, Directory und File (in System.IO) spiel mal damit herum…dann spar ich mir erklärungen über dinge, die du schon kannst …

es hat da am XmlDocument (= xDoc) sowas wie xDoc.OuterXml das
ist vom typ string, und wenn du sowas speichern kannst…

inner und outerxml kenn ich auch schon. hab innerxml zumindest
beim auslesen benötigt.

das versteh ich jetzt niocht, ich dachte, das hättest du über xpath gemacht…

ich nutze VisualXPath fürs Visual Studio :smile:

ist das ein external tool?
ist das geil?

pfiehl glügg!
stefan

Hallo zusammen.

node.innerText = „bla“;
Setzt den Wert.

doc.SelectSingleNode(xPath);
liefert genau einen Knoten, ggfs. den ersten!

doc.SelectNodes(xPath);
liefert ein NodeSet, das man dann abklappern kann.

doc.Save(fileName);
ermöglicht das Speichern.

OuterXML und InnerXml etc. sollten kaum gebraucht werden. Der Zugriff per (siehe oben) ist idR ausreichend!

mfg

Dirk

naja manchmal hab ich mich so festgefahren das mir jemand wieder nen tritt in die richtige richtung geben muss *gg*

und nicht das ihr meint ich lass mir von euch alles vorsagen. erst probier ich viel aus, lese, studiere beispielcode etc und erst wenn alle strike reißen bitte ich um hilfe :smile:

ich werds gleich mal ausprobieren :smile:
danke schonmal im vorraus…

werd mich u.u nochmal in dem thread hier melden falls ich es net hinkrieg :smile:

du hast das alte element (über xpath oder von obi…): xOld

du legst das neue xmlelement xNew an:

xNew = xOld.OwnerDocument.CreateElement(„neuesElement“)
xOld.ParentNode.ReplaceChild(xOld, xNew);

you want attributes?:
xNew.Attributes.Add(…)…

ok habs jetzt mal so gemacht:

XmlElement xmlRootElement = doc.DocumentElement;
XmlNode xmlOldElement = xmlRootElement.SelectSingleNode(XPath, nsmgr);
XmlNode xmlNewElement = xmlOldElement.OwnerDocument.CreateElement(„value“);

[XPath steht für den String, den ich wegen überlänge rausgekürzt hab]

hab jetzt folgende frage. Anhand des XPath des OldElements kann man das neue element gezielt wo einfügen und mit CreateElement legt man logischerweise ein neues element an, stimmts oder hab ich nen denkfehler drin)
Allerdings gibt es xmlNewElement.Attributes.Add!! nicht.

Visual XPath is net schlecht. Recht schlichtes Programm, aber ich find es irgendwie net schlecht

XmlElement xmlRootElement = doc.DocumentElement;
XmlNode xmlOldElement = xmlRootElement.SelectSingleNode(XPath,
nsmgr);
XmlNode xmlNewElement =
xmlOldElement.OwnerDocument.CreateElement(„value“);

Du must den neuen Knoten noch an seine Stelle bringen:
xmlOldElement.AppendChild(xmlNewElement);
Sofern xmlOldElement der Elternknoten ist.

hab jetzt folgende frage. Anhand des XPath des OldElements
kann man das neue element gezielt wo einfügen und mit
CreateElement legt man logischerweise ein neues element an,
stimmts oder hab ich nen denkfehler drin)
Allerdings gibt es xmlNewElement.Attributes.Add!! nicht.

Ein Attribut im Doc erzeugen:
XmlAttribute attr = doc.CreateAttribute(„attrBezeichnung“);

Dem einen Wert geben:
attr.Value = „Wert“;

Und das Attribut einem Knoten Zuordnen:
xmlNewElement.Attributes.Append(attr);

Es geht wohl auch anders MS.net Hilfe:
XmlDocument doc = new XmlDocument();
doc.LoadXml("" +
„Pride And Prejudice“ +
„“);

XmlNode root = doc.FirstChild;
//Create a new attribute.
string ns = root.GetNamespaceOfPrefix(„bk“);
XmlNode attr = doc.CreateNode(XmlNodeType.Attribute, „genre“, ns);
attr.Value = „novel“;

//Add the attribute to the document.
root.Attributes.SetNamedItem(attr);

Console.WriteLine(„Display the modified XML…“);
doc.Save(Console.Out);

Visual XPath is net schlecht. Recht schlichtes Programm, aber
ich find es irgendwie net schlecht

Hoffe das ist zu c# soweit kompatibel.

mfg

Dirk

Letztes Problem: WellFormed
ok also es funktioniert alles einwandfrei.
ich benutzer nen XmlTextWriter um die File mit doc.save zu speichern.
Attribute werden neu gesetzt alles funzt wunderbar.
Aber er speichert alles nur noch in eine Zeile ohne umbruch ohne einrücken. das problem dabei ist, das ding is kaum lesbar ^^ aber der etwas problematischere aspekt ist das es ne xmlexception gibt sobald der namespacemanager initialisiert wird.

ich poste am besten nochmal den dafür relevanten code vielleicht kann mir jemand noch einmal helfen. danach kann die klasse schreiben und lesen und ich denke mal mit den hier gelernten sachen werd ich erstellen
(falls file nicht vorhanden) und löschen (wenn etwas aus der file rausgelöscht wird) selbst hinkriegen. is ja im grunde fast das gleich.

aber zurück zum thema:

doc.load(file);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
XmlTextWriter xmlTWriter = new XmlTextWriter(new StreamWriter(„config.xml“));
doc.Save(xmlTWriter);

so zwischen denen paar zeilen steht halt noch das ganze von xmlnode node1 = usw… das denke ich mal ist aber nicht wichtig für die formatierung oder irre ich mich?

Achja da ich gerne auch den code verstehe den ich selbst schreibe bzw dank freundlicher menschen, die mir, zusammensuche oder -baue.
Würd ich gerne noch die Aufgabe des NamespaceManagers erfahren…

Ich bedanke mich wie immer recht herzlich