Autor Beitrag
Sonador
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 15.07.08 11:45 
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...

ausblenden 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
ausblenden volle Höhe 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.

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 15.07.08 13:23 
Überdenke die Logik der do-wile-Schleife. Könnte es sein, dass du sie mit Pascals repeat-until-Schleife verwechselt hast ;) ?
Sonador Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 15.07.08 14: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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 15.07.08 15: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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 15.07.08 17:22 
Das ist leider auch unbefriedigend.. dann sieht es nämlich so aus:

ausblenden 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.