C #: XmlTextWriter.WriteElementString non riesce in stringhe vuote?
-
19-09-2019 - |
Domanda
Sto usando XmlTextWriter
e il suo metodo WriteElementString
, ad esempio:
XmlTextWriter writer = new XmlTextWriter("filename.xml", null);
writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();
writer.Close();
L'output XML previsto è:
<User>
<Username>value</Username>
<Email>value</Email>
</User>
Tuttavia, se per esempio inputEmail è vuota, il codice XML risultato che ottengo come nel seguente modo:
<User>
<Username>value</Username>
<Email/>
</User>
considerando che mi sarei aspettato di essere:
<User>
<Username>value</Username>
<Email></Email>
</User>
Che cosa sto facendo di sbagliato? C'è un modo per raggiungere il mio risultato atteso in modo semplice utilizzando XmlTextWriter
?
Soluzione
L'output è corretto. Un elemento senza contenuto deve essere scritto come <tag/>
.
È possibile forzare l'utilizzo della piena tag chiamando WriteFullEndElement ()
writer.WriteStartElement("Email");
writer.WriteString(inputEmail);
writer.WriteFullEndElement();
Tale <Email></Email>
stamperà quando inputEmail è vuoto.
Se si vuole fare che più di una volta, si potrebbe creare un metodo di estensione:
public static void WriteFullElementString(this XmlTextWriter writer,
string localName,
string value)
{
writer.WriteStartElement(localName);
writer.WriteString(value);
writer.WriteFullEndElement();
}
Poi il codice sarebbe diventato:
writer.WriteStartElement("User");
writer.WriteFullElementString("Username", inputUserName);
writer.WriteFullElementString("Email", inputEmail);
writer.WriteEndElement();
Altri suggerimenti
E non manca <Tag/>
è solo una scorciatoia per <Tag></Tag>
Il codice dovrebbe essere:
using (XmlWriter writer = XmlWriter.Create("filename.xml"))
{
writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();
}
Questo consente di evitare le perdite di risorse in caso di eccezioni, e utilizza il modo corretto di creare un XmlReader (dal NET 2.0).
Lasciando questo qui in caso qualcuno ne ha bisogno; dal momento che nessuna delle risposte sopra risolto per me, o sembrava eccessivo.
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();
Il trucco è stato quello di impostare la XmlWriterSettings.Indent = true e aggiungerlo alla XmlWriter .
Modifica:
In alternativa è possibile utilizzare anche
w.Formatting = Formatting.Indented;
invece di aggiungere un XmlWriterSettings
.