Pregunta

Estoy usando XmlTextWriter y su método WriteElementString, por ejemplo:

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

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

writer.Close();

La salida XML esperado es:

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

Sin embargo, si por ejemplo inputEmail está vacía, el resultado XML consigo como de la siguiente manera:

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

Mientras que yo esperaría que sea:

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

¿Qué estoy haciendo mal? ¿Hay una manera de lograr mi resultado esperado de una manera sencilla utilizando XmlTextWriter?

¿Fue útil?

Solución

Su salida es correcta. Un elemento sin contenido debe ser escrito como <tag/>.

Puede forzar el uso de la etiqueta completa llamando WriteFullEndElement ()

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

Esa es la salida cuando <Email></Email> inputEmail está vacía.

Si usted quiere hacer que más de una vez, podría crear un método de extensión:

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

A continuación, el código se convertiría en:

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

Otros consejos

No deja <Tag/> es sólo un atajo para <Tag></Tag>

El código debería ser:

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

Esto evita fugas de recursos en caso de excepciones, y utiliza la forma correcta para crear un XmlReader (desde .NET 2.0).

Dejando esto aquí por si alguien lo necesita; ya que ninguna de las respuestas anteriores resuelto por mí, o que pareció una exageración.

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

El truco consistía en establecer el XmlWriterSettings.Indent = true y añadirlo a la XmlWriter .

Editar:

Como alternativa también se puede utilizar

w.Formatting = Formatting.Indented;

en lugar de la adición de un XmlWriterSettings.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top