visual valid typeparam see remarks example cref comment c# xml string formatting string-formatting

valid - typeparam c#



En C#, ¿cuál es el mejor método para formatear una cadena como XML? (10)

Estoy creando un editor ligero en C # y me gustaría saber cuál es el mejor método para convertir una cadena en una cadena XML con un bonito formato. Espero que haya un método público en la biblioteca de C # como "bool público FormatAsXml (texto de cadena, cadena de salida formateadaXmlText)", pero no podría ser tan fácil, ¿o sí?

Muy específicamente, ¿cuál sería el método "SomeMethod" que produciría el resultado a continuación?

string unformattedXml; string formattedXml; unformattedXml = "<?xml version=/"1.0/"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>" formattedXml = SomeMethod(unformattedXml); Console.WriteLine(formattedXml);

Salida:

<?xml version="1.0"?> <book id="123"> <author>Lewis, C.S.</author> <title>The Four Loves</title> </book>


¿Es la cadena XML válido? ¿Quiere decir cómo puede convertir una cadena XML en un documento XML? Si es así, haz esto:

XmlDocument xml = new XmlDocument(); xml.LoadXml( YourString );


Parece que desea cargar el XML en objetos XmlTextWriter y establecer las propiedades de formateo y sangría:

writer.Formatting = Formatting.Indented; writer.Indentation = 1; writer.IndentChar = ''/t'';


Si solo necesita escapar caracteres XML, lo siguiente puede ser útil:

string myText = "This & that > <> &lt;"; myText = System.Security.SecurityElement.Escape(myText);


Usando el nuevo espacio de nombres System.Xml.Linq (System.Xml.Linq Assembly) puede usar lo siguiente:

string theString = "<nodeName>blah</nodeName>"; XDocument doc = XDocument.Parse(theString);

También puedes crear un fragmento con:

string theString = "<nodeName>blah</nodeName>"; XElement element = XElement.Parse(theString);

Si la cadena aún no es XML, puede hacer algo como esto:

string theString = "blah"; //creates <nodeName>blah</nodeName> XElement element = new XElement(XName.Get("nodeName"), theString);

Algo a tener en cuenta en este último ejemplo es que XElement XML Encode la cadena proporcionada.

Recomiendo encarecidamente las nuevas clases XLINQ. Son más livianos y más fáciles de usar que la mayoría de los tipos existentes relacionados con XmlDocument.


string unformattedXml = "<?xml version=/"1.0/"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; string formattedXml = XElement.Parse(unformattedXml).ToString(); Console.WriteLine(formattedXml);

Salida:

<book> <author>Lewis, C.S.</author> <title>The Four Loves</title> </book>

La Declaración Xml no es producida por ToString (), sino por Guardar () ...

XElement.Parse(unformattedXml).Save(@"C:/doc.xml"); Console.WriteLine(File.ReadAllText(@"C:/doc.xml"));

Salida:

<?xml version="1.0" encoding="utf-8"?> <book> <author>Lewis, C.S.</author> <title>The Four Loves</title> </book>


El enfoque de Jason es el más simple. Este es el método:

private static string FormatXmlString(string xmlString) { System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString); return element.ToString(); }


Lamentablemente, no, no es tan fácil como el método FormatXMLForOutput, aquí habla Microsoft;)

De todos modos, a partir de .NET 2.0, el enfoque recomendado es usar XMlWriterSettingsClass para configurar el formateo, en lugar de establecer propiedades directamente en el objeto XmlTextWriter. Vea esta página de MSDN para más detalles. Dice:

"En la versión .NET Framework versión 2.0, la práctica recomendada es crear instancias XmlWriter utilizando el método XmlWriter.Create y la clase XmlWriterSettings. Esto le permite aprovechar al máximo todas las nuevas características presentadas en esta versión. Para obtener más información, ver Creación de Escritores XML. "

Aquí hay un ejemplo del enfoque recomendado:

XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = (" "); using (XmlWriter writer = XmlWriter.Create("books.xml", settings)) { // Write XML data. writer.WriteStartElement("book"); writer.WriteElementString("price", "19.95"); writer.WriteEndElement(); writer.Flush(); }


Suponiendo que solo quiere volver a formatear un documento XML para poner nuevos nodos en nuevas líneas y agregar sangrado, entonces, si usa .NET 3.5 o superior, entonces la mejor solución es analizar y luego generar con XDocument, algo así como:

string unformattedXml; string formattedXml; unformattedXml = "<?xml version=/"1.0/"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToString(); Console.WriteLine(formattedXml);

Neat hu?

Esto debería volver a formatear los nodos XML.

Hacer esto con versiones anteriores del marco requiere mucho más trabajo de campo ya que no hay funciones integradas para volver a calcular el espacio en blanco.

De hecho, hacerlo usando clases pre-Linq sería:

string unformattedXml; string formattedXml; unformattedXml = "<?xml version=/"1.0/"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.LoadXml(unformattedXml); System.Text.StringBuilder sb = new System.Text.StringBuilder(); System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb, new System.Xml.XmlWriterSettings() { Indent = true }); doc.WriteTo(xw); xw.Flush(); formattedXml = sb.ToString(); Console.WriteLine(formattedXml);


System.Xml.Linq.XElement.ToString () formatea automáticamente!

XElement formattedXML = new XElement.Parse(unformattedXmlString); Console.WriteLine(formattedXML.ToString());


En Framework 4.0 es simple.

var unformattedXml = "<?xml version=/"1.0/"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml); var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "/r/n" : "") + xdoc.ToString(); Console.WriteLine(formattedXml);

Esto agrega la sangría requerida y mantiene la Declaración Xml .

<?xml version="1.0"?> <book> <author>Lewis, C.S.</author> <title>The Four Loves</title> </book>