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(01);

            if (key != null && key != "")
                if (key[key.Length - 1] == '/')
                    key = key.Remove(key.Length - 11);

            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 user profile iconChristian 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.