Frage

Ich verwende XmlTextWriter und seine WriteElementString Verfahren, zum Beispiel:

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

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

Wenn jedoch zum Beispiel inputEmail leer ist, folgt das Ergebnis XML I erhalten, wie zum Beispiel:

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

Während ich es erwarten würde 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?

War es hilfreich?

Lösung

Die Ausgabe ist korrekt. 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 ist.

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

Andere Tipps

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

Ihr Code sollte sein:

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

Diese Ressourcenlecks bei Ausnahmen vermeidet, und verwendet die richtige Art und Weise eine XmlReader (seit .NET 2.0).

zu erstellen

Verlassen dieses hier, falls jemand es braucht; da keine der Antworten gelöst es oben für mich, oder schien wie viel des Guten.

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 auf XmlWriterSettings.Indent = true , und fügen Sie die XmlWriter .

Edit:

Alternativ können Sie auch

w.Formatting = Formatting.Indented;

stattdessen ein XmlWriterSettings hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top