2009-07-24 7 views
7

J'utilise XmlTextWriter et sa méthode WriteElementString, par exemple:C#: XmlTextWriter.WriteElementString échoue sur les chaînes vides?

XmlTextWriter writer = new XmlTextWriter("filename.xml", null); 

writer.WriteStartElement("User"); 
writer.WriteElementString("Username", inputUserName); 
writer.WriteElementString("Email", inputEmail); 
writer.WriteEndElement(); 

writer.Close(); 

La sortie XML attendu est:

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

Cependant, si par exemple inputEmail est vide, le XML résultat je reçois comme comme suit:

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

Alors que je pense que ce soit:

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

Qu'est-ce que je fais mal? Existe-t-il un moyen d'atteindre mon résultat escompté de manière simple en utilisant XmlTextWriter?

Répondre

18

Votre sortie est correcte. Un élément sans contenu doit être écrit <tag/>.

Vous pouvez forcer l'utilisation de l'étiquette complète en appelant WriteFullEndElement()

writer.WriteStartElement("Email"); 
writer.WriteString(inputEmail); 
writer.WriteFullEndElement(); 

qui <Email></Email> sortie lorsque inputEmail est vide.

Si vous voulez faire plus d'une fois, vous pouvez créer une méthode d'extension:

public static void WriteFullElementString(this XmlTextWriter writer, 
              string localName, 
              string value) 
{ 
    writer.WriteStartElement(localName); 
    writer.WriteString(value); 
    writer.WriteFullEndElement(); 
} 

Ensuite, votre code serait:

writer.WriteStartElement("User"); 
writer.WriteFullElementString("Username", inputUserName); 
writer.WriteFullElementString("Email", inputEmail); 
writer.WriteEndElement(); 
+0

cette solution ne fonctionne pas à mon extrémité étrangement –

+0

J'ai utilisé exactement la même solution que vous avez fournie, et la méthode WriteFullEndElement() ne semble pas fonctionner ... Methinks cette méthode est défectueuse. –

+0

J'ai trouvé une solution de contournement en C#. Si le (string.Length == 0), remplacez la chaîne vide par un caractère d'échappement de nouvelle ligne, c'est-à-dire "\ n" –

4

Il ne manque pas <Tag/> est juste un raccourci pour <Tag></Tag>

+0

Il est possible de le forcer à sortir ? –

+0

Je ne pense pas. – RaYell

+0

Si c'est un problème, vous avez tous le droit de crier à quiconque vous oblige à écrire les étiquettes dans leur intégralité; ils doivent suivre les spécifications XML de base. – Nyerguds

2

Votre code doit être:

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

Cela évite les fuites de ressources en cas d'exceptions et utilise la méthode appropriée pour créer un XmlReader (depuis .NE T 2,0).

0

En laissant ceci ici au cas où quelqu'un en aurait besoin; puisque aucune des réponses ci-dessus ne l'a résolu pour moi, ou a semblé comme exagéré.

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

L'astuce était de régler le XmlWriterSettings.Indent = true et l'ajouter à la XmlWriter.

Edit:

Sinon, vous pouvez également utiliser

w.Formatting = Formatting.Indented; 

au lieu d'ajouter un XmlWriterSettings.

Questions connexes