2009-07-24 18 views
7

Sto usando XmlTextWriter e il suo metodo WriteElementString, ad esempio:C#: XmlTextWriter.WriteElementString non riesce su stringhe vuote?

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 atteso è:

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

Tuttavia, se per esempio inputEmail è vuota, il codice XML risultato che ottengo come come segue:

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

mentre mi aspetto che sia:

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

Cosa sto sbagliando? C'è un modo per raggiungere il risultato atteso in modo semplice usando XmlTextWriter?

risposta

18

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

che sarà uscita <Email></Email> 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(); 
+0

questa soluzione non funziona alla mia estremità stranamente –

+0

Ho usato la stessa identica soluzione che hai fornito e il metodo WriteFullEndElement() non sembra funzionare ... Methinks questo metodo è difettoso. –

+0

Ho trovato una soluzione alternativa in C#. Se (string.Length == 0), sostituisci la stringa vuota con un carattere di escape di nuova riga, ad esempio "\ n" –

4

non manca <Tag/> è solo una scorciatoia per <Tag></Tag>

+0

È possibile forzarlo all'uscita ? –

+0

Io non la penso così. – RaYell

+0

Se questo è un problema, hai tutto il diritto di urlare a chi ti chiede di scrivere i tag per intero; hanno bisogno di seguire le specifiche XML di base. – Nyerguds

2

Il codice dovrebbe essere:

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

Ciò evita perdite di risorse in caso di eccezioni e utilizza il modo corretto per creare un XmlReader (dal .NE T 2.0).

0

Lasciando questo qui nel caso qualcuno ne abbia bisogno; poiché nessuna delle risposte di cui sopra ha 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 era quello di impostare la XmlWriterSettings.Indent = true e aggiungerlo alla XmlWriter.

Edit:

In alternativa è anche possibile utilizzare

w.Formatting = Formatting.Indented; 

invece di aggiungere un XmlWriterSettings.

Problemi correlati