2009-07-24 15 views
7

Ich XmlTextWriter und seine WriteElementString Verfahren, zum Beispiel mit:C#: XmlTextWriter.WriteElementString schlägt bei leeren Zeichenfolgen fehl?

XmlTextWriter writer = new XmlTextWriter("filename.xml", null); 

writer.WriteStartElement("User"); 
writer.WriteElementString("Username", inputUserName); 
writer.WriteElementString("Email", inputEmail); 
writer.WriteEndElement(); 

writer.Close(); 

Die erwartete XML-Ausgabe ist:

<User> 
    <Username>value</Username> 
    <Email>value</Email> 
</User> 

Wenn jedoch zum Beispiel inputEmail leer ist, bekommen das Ergebnis XML ich als wie folgt:

<User> 
    <Username>value</Username> 
    <Email/> 
</User> 

während ich würde erwarten, dass es sein:

<User> 
    <Username>value</Username> 
    <Email></Email> 
</User> 

Was mache ich falsch? Gibt es eine Möglichkeit, mein erwartetes Ergebnis auf einfache Weise mit XmlTextWriter zu erreichen?

Antwort

18

Ihr Ausgang ist richtig. Ein Element ohne Inhalt sollte als <tag/> geschrieben werden.

Sie können die Nutzung des vollen Tag erzwingen, indem WriteFullEndElement Aufruf()

writer.WriteStartElement("Email"); 
writer.WriteString(inputEmail); 
writer.WriteFullEndElement(); 

Das wird ausgegeben <Email></Email> wenn inputEmail leer.

Falls Sie mehr tun wollen als einmal, könnten Sie eine Erweiterungsmethode erstellen:

public static void WriteFullElementString(this XmlTextWriter writer, 
              string localName, 
              string value) 
{ 
    writer.WriteStartElement(localName); 
    writer.WriteString(value); 
    writer.WriteFullEndElement(); 
} 

Dann würde Ihr Code werden:

writer.WriteStartElement("User"); 
writer.WriteFullElementString("Username", inputUserName); 
writer.WriteFullElementString("Email", inputEmail); 
writer.WriteEndElement(); 
+0

diese Lösung funktioniert nicht an meinem Ende seltsam –

+0

Ich verwendete genau die gleiche Lösung, die Sie zur Verfügung gestellt, und die WriteFullEndElement() -Methode scheint nicht zu funktionieren ... Ich denke, diese Methode ist fehlerhaft. –

+0

Ich habe einen Workaround in C# gefunden. Wenn die (string.Length == 0), dann ersetzen Sie die leere Zeichenfolge durch ein Newline-Escape-Zeichen, dh "\ n" –

4

Es ist nicht <Tag/> nicht nur eine Abkürzung für <Tag></Tag>

+0

Es ist möglich, die Ausgabe zu erzwingen? –

+0

Ich glaube nicht. – RaYell

+0

Wenn das ein Problem ist, haben Sie alle Recht, an zu schreien, wer Sie benötigt, um die Tags vollständig zu schreiben; Sie müssen den grundlegenden XML-Spezifikationen folgen. – Nyerguds

2

Ihr Code sein sollte:

using (XmlWriter writer = XmlWriter.Create("filename.xml")) 
{ 
    writer.WriteStartElement("User"); 
    writer.WriteElementString("Username", inputUserName); 
    writer.WriteElementString("Email", inputEmail); 
    writer.WriteEndElement(); 
} 

Dies vermeidet Ressourcenverluste im Falle von Ausnahmen und verwendet den richtigen Weg, um einen XmlReader zu erstellen (seit .NE T 2.0).

0

Das hier lassen, falls jemand es braucht; denn keine der obigen Antworten löste es für mich oder schien übertrieben zu sein.

FileStream fs = new FileStream("file.xml", FileMode.Create); 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    XmlWriter w = XmlWriter.Create(fs, settings); 
    w.WriteStartDocument(); 
    w.WriteStartElement("tag1"); 

     w.WriteStartElement("tag2"); 
     w.WriteAttributeString("attr1", "val1"); 
     w.WriteAttributeString("attr2", "val2"); 
     w.WriteFullEndElement(); 

    w.WriteEndElement(); 
    w.WriteEndDocument(); 
    w.Flush(); 
    fs.Close(); 

Der Trick war, die XmlWriterSettings.Indent = true und fügen Sie es dem XmlWriter einzustellen.

Edit:

Alternativ können Sie auch

w.Formatting = Formatting.Indented; 

verwenden, anstatt eine XmlWriterSettings hinzuzufügen.

Verwandte Themen