C #: XmlTextWriter.WriteElementString falla en cadenas vacías?
-
19-09-2019 - |
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
?
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
.