sharp - En C#, ¿cómo convierto un XmlNode a cadena, con sangría?(Sin bucles)
xml c# tutorial (1)
Esto tiene que ser una pregunta tan simple, pero simplemente no puedo obtener la respuesta.
Tengo un XmlNode y todo lo que quiero hacer es generar este nodo, como una cadena, con sangrías (tabulaciones o espacios) intactos para proporcionar una mejor legibilidad.
Hasta ahora he intentado XmlWriter, XmlTextWriter, XmlDocument, XmlReader.
- Probé PreserveWhitespace en XmlDocument pero no pude obtener XmlDocument para generar mi nodo.
- Probé la propiedad Formatting = Formatting.Indented en XmlTextWriter pero no pude averiguar cómo generar el contenido en una cadena.
Para generar el XmlNode como cadena SIN sangría es fácil. Acabo de hacer XmlNode.OuterXml. ¿Cómo consigo las muescas allí?
Quiero hacer esto sin hacer un bucle a través de XmlNode y usar la fuerza bruta para agregar espacios en blanco, porque creo que debería haber una forma más simple.
Gracias.
Edición: Para futuros lectores, aquí está la respuesta:
var xmlNode = is some object of type XmlNode
using (var sw = new StringWriter())
{
using (var xw = new XmlTextWriter(sw))
{
xw.Formatting = Formatting.Indented;
xw.Indentation = 2; //default is 1. I used 2 to make the indents larger.
xmlNode.WriteTo(xw);
}
return sw.ToString(); //The node, as a string, with indents!
}
La razón por la que necesitaba hacer esto fue generar el xml del nodo con resaltado de sintaxis. Utilicé AvalonEdit para resaltar el xml, realicé el texto resaltado a html, luego convertí el html en un FlowDocument que se podía mostrar en un RichTextBox.
XMLTextWriter
en el camino correcto con el XMLTextWriter
, simplemente necesita usar un StringWriter
como el flujo base. Aquí hay algunas buenas respuestas sobre cómo se logra esto. Preste especial atención a la segunda respuesta, si su codificación necesita ser UTF-8.
Editar:
Si necesita hacer esto en varios lugares, es trivial escribir un método de extensión para sobrecargar un ToString()
en XmlNode
:
public static class MyExtensions
{
public static string ToString(this System.Xml.XmlNode node, int indentation)
{
using (var sw = new System.IO.StringWriter())
{
using (var xw = new System.Xml.XmlTextWriter(sw))
{
xw.Formatting = System.Xml.Formatting.Indented;
xw.Indentation = indentation;
node.WriteContentTo(xw);
}
return sw.ToString();
}
}
}