.net - recommendation - seo meta descriptions
¿Podemos obligar a XmlWriter a emitir<my-tag></my-tag> en lugar de<my-tag/>? (8)
Dejando esto aquí por si alguien lo necesita; ya que ninguna de las respuestas anteriores me lo resolvió, o me 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 consistió en establecer XmlWriterSettings.Indent = true y agregarlo a XmlWriter .
Editar:
Alternativamente también puedes usar
w.Formatting = Formatting.Indented;
En lugar de agregar un XmlWriterSettings.
Por defecto,
someXmlWriter.WriteElementString("my-tag", someString);
produce <my-tag />
Busqué en la clase XmlWriterSettings las posibles opciones que forzarían al escritor a producir <my-tag></my-tag>
lugar, pero no encontré nada.
¿Existe una forma sencilla de obligar a XmlWriter a emitir elementos vacíos con "etiqueta abierta, etiqueta cerrada" en lugar de con la forma de mano corta?
Editar :
¡Sí! Me doy cuenta de que, con respecto a la validez XML, las dos notaciones son equivalentes, válidas y todas ... Sin embargo, estoy trabajando con el código heredado que analiza dicho XML usando Read (), es decir, a nivel de nodo (!) Y las cosas se confunden con Read () -ing cuando está en un nodo vacío ...
Por lo tanto, mi pregunta surge en el contexto de limitar la cantidad de cambios a este código heredado. De hecho, la pregunta se superpone con esta pregunta de SO como se sugiere; Sin embargo, ninguna de las opciones ofrecidas son fácilmente aplicables a mi situación.
Esto funcionó para mí:
writer.WriteStartElement("my-tag");
writer.WriteRaw(someString);
writer.WriteFullEndElement();
WriteEndElement sigue auto cerrado la etiqueta
Has intentado algo como ésto:
if (someString.Length > 0)
{
someXmlWriter.WriteElementString("my-tag", someString);
}
else
{
someXmlWriter.WriteStartElement("my-tag");
someXmlWriter.WriteEndElement("my-tag");
}
Tal vez hacer una clase de utilidad con eso como una función miembro.
No hay opciones de configuración para hacer eso en .Net. Son lo mismo y cualquier analizador debería poder manejar XML válido.
Prueba esto:
x.WriteStartElement("my-tag");
//Value of your tag is null
If (<"my-tag"> == "")
{
x.WriteWhitespace("");
}else
x.WriteString(my-tag);
x.WriteEndElement();
Si recibe el mensaje Extension method can only be declared in non-generic, non-nested static class
ya que la palabra se puede resaltar, simplemente cree una clase de extensión como se muestra a continuación:
public static class Extension
{
public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value)
{
writer.WriteStartElement(localName);
writer.WriteRaw(value);
writer.WriteFullEndElement();
}
}
Espero que esto resulte útil :-)
Simplemente me encontré con el mismo problema, y aunque parece una especie de pirateo, esto sí funcionó y fue muy discreto con el código existente con el que tenía que trabajar.
private static XElement MakeElementLongHand(this XElement rootElem)
{
rootElem.Value = " ";
rootElem.Value = string.Empty;
return rootElem;
}
Yo uso el siguiente código:
if (string.IsNullOrEmpty(myStringValue))
{
myWriter.WriteStartElement("mytag");
myWriter.WriteFullEndElement();
}
else
{
myWriter.WriteElementString("mytag", myStringValue);
}