Entwickler-Ecke
IO, XML und Registry - XML mit leerer Node erzeugen
Sonador - Di 15.07.08 10:45
Titel: XML mit leerer Node erzeugen
Hallo,
ich hab folgendes Problem. Ich möchte eine XML-Konfigurationsdatei erzeugen welche auch leere Einträge enthalten soll. Beim erstellen der Datei werden aber die einträge mit leerem innertext falsch reingeschrieben und das schreiben nach dem zweiten EIntrag abgebrochen. Alle weiteren Einträge, welche in die XML geschrieben werden sollen werden dem letzten Knoten zugeordnet anstatt das ein neuer erzeugt wird.
Diese XML wird erzeugt...
XML-Daten
1: 2: 3: 4: 5: 6:
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <settings> <SaperionUsername>administrator</SaperionUsername> <SaperionPassword> </SaperionPassword> </settings> |
dabei benutze ich die folgenden zwei Methoden
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| public void Write(string key, string newValue) { XmlNode node = FindNode(key, true); node.InnerText = newValue; xmlDoc.Save(xmlFile); }
private XmlNode FindNode(string key, bool createNew) { if (key != null && key != "") if (key[0] == '/') key = key.Remove(0, 1);
if (key != null && key != "") if (key[key.Length - 1] == '/') key = key.Remove(key.Length - 1, 1);
char[] splitChars = { '/' }; string[] parts = key.Split(splitChars);
XmlNode node = root; XmlNode child = null;
foreach (string entry in parts) { child = node.FirstChild; do { if (child == null || child.Name == entry) break;
child = child.NextSibling; } while (child == null);
if (child == null) { child = xmlDoc.CreateElement(entry); node.AppendChild(child); } node = child; } return node; } |
das ganze wird aufgerufen über diesen Aufruf: Wenn dann, wie beim zweiten aufruf, der übergebene Inhalt ein leerer String ist, dann stimmt irgendwas in der XML ncht mehr.
C#-Quelltext
1: 2: 3:
| myConfig.Write("SaperionUsername", "administrator"); myConfig.Write("SaperionPassword", ""); ... |
soviel erstmal dazu. Mein Problem ist nun, dass ich gerne die folgede XML hätte:
XML-Daten
1: 2: 3: 4: 5: 6:
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <settings> <SaperionUsername>administrator</SaperionUsername> <SaperionPassword></SaperionPassword> ... </settings> |
Kann mir jemand dazu helfen?
Moderiert von
Christian S.: Quote- durch XML- und C#-Tags ersetzt
Kha - Di 15.07.08 12:23
Überdenke die Logik der do-wile-Schleife. Könnte es sein, dass du sie mit Pascals repeat-until-Schleife verwechselt hast ;) ?
Sonador - Di 15.07.08 13:03
Also gut...Nach dem Umkehren der Schleifen-Bedingung (aus == mach != ) sieh es schon mal nicht schlecht aus. Aber die Formatierung ist immer noch bescheiden (siehe unten) wenn der Inhalt der Tags leer ist. WIe kann ich verhindern dass es da zu einem Zeilenumbruch kommt?
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <settings> <SaperionUsername>administrator</SaperionUsername> <SaperionPassword> </SaperionPassword> <DBusername>bla</DBusername> <DBpassword>bla</DBpassword> <DBtrustedconnection>false</DBtrustedconnection> <DBname>saperion</DBname> <FileDir>f: mp</FileDir> <FileUseSubDirs>false</FileUseSubDirs> <FileDirNetLogin> </FileDirNetLogin> <FileDirNetPassword> </FileDirNetPassword> <IndexTargetDDC>test</IndexTargetDDC> <Index_Fieldname1> </Index_Fieldname1> <Index_FieldName2> </Index_FieldName2> </settings> |
Kha - Di 15.07.08 14:50
Du könntest bei einem Leer-String InnerText einfach erst gar nicht setzen ;) . Ansonsten bietet XmlDoc afaik keine Möglichkeiten, die Formattierung anzupassen (außer PreserveWhitespace).
Sonador - Di 15.07.08 16:22
Das ist leider auch unbefriedigend.. dann sieht es nämlich so aus:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <settings> <SaperionUsername>administrator</SaperionUsername> <SaperionPassword /> <DBusername>bla</DBusername> <DBpassword>bla</DBpassword> <DBtrustedconnection>false</DBtrustedconnection> <DBname>saperion</DBname> <FileDir>f: mp</FileDir> <FileUseSubDirs>false</FileUseSubDirs> <FileDirNetLogin /> <FileDirNetPassword /> <IndexTargetDDC>test</IndexTargetDDC> <Index_Fieldname1 /> <Index_FieldName2 /> <Index_FieldName3 /> </settings> |
das Wahre ist das noch nicht, denn wenn jemand die xml manuell ändern will müsste er die tags abändern dass sie noch dem vorgegebenen Schema entsprechen und richtig ausgelesen werden können.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!