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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top