C #: XmlTextWriter.WriteElementString nicht auf leeren Saiten?
-
19-09-2019 - |
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?
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 erstellenVerlassen 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.