Question

J'utilise XmlTextWriter et sa méthode WriteElementString, par exemple:

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 fichier XML de résultat que je reçois comme comme suit:

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

Alors que je pensais que ce serait:

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

Qu'est-ce que je fais mal? Y at-il un moyen d'atteindre mon résultat attendu d'une manière simple en utilisant XmlTextWriter?

Était-ce utile?

La solution

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

Cette volonté sortie <Email></Email> quand 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();
}

Alors votre code deviendrait:

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

Autres conseils

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

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 permet d'éviter les fuites de ressources en cas d'exceptions, et utilise la bonne façon de créer un XmlReader (depuis .NET 2.0).

En quittant ce ici au cas où quelqu'un en a besoin; car aucune des réponses ci-dessus résolu pour moi, ou semblait être surpuissant.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top