Estoy creando un ligero editor en C# y quisiera saber el mejor método para convertir una cadena en un formato agradable cadena XML. Tengo la esperanza de que hay un método público en la C# biblioteca como «public bool FormatAsXml(string texto, fuera de la cadena de formattedXmlText)», pero no podía ser tan fácil, ¿no?

Muy específicamente, ¿cuál sería el método de «SomeMethod» tiene que ser el que produciría la salida de abajo?

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

De salida:

<?xml version="1.0"?>
  <book id="123">
    <author>Lewis, C.S.</author>
    <title>The Four Loves</title>
  </book>
InformationsquelleAutor JohnnyM | 2008-10-12

10 Comentarios

  1. 71
    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);

    De salida:

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

    La Declaración Xml no es la salida por ToString(), pero es de Guardar() …

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

    De salida:

    <?xml version="1.0" encoding="utf-8"?>
    <book>
      <author>Lewis, C.S.</author>
      <title>The Four Loves</title>
    </book>
    • Gracias, es justo lo que yo buscaba 🙂
    • Parece como método Parse() no analizar una cadena sin la declaración XML.
  2. 15

    Por desgracia no, no es tan fácil como un FormatXMLForOutput método, esto es Microsoft estuvieron hablando aquí 😉

    De todos modos, como de .NET 2.0, el enfoque recomendado es el uso de la XMlWriterSettingsClass para configurar el formato, como contraposición a la configuración de las propiedades directamente en el objeto XmlTextWriter. Ver esta página de MSDN para obtener más detalles. Dice:

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

    Aquí es 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();
    }
  3. 13

    A utilizar el nuevo Sistema.Xml.Linq espacio de nombres (del Sistema.Xml.Linq Asamblea) puede utilizar el siguiente:

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

    También puede crear un fragmento con:

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

    Si la cadena no es todavía XML, usted 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 se XML Codificar la cadena.

    Recomiendo el nuevo XLINQ clases. Son más ligeros de peso, y más fácil para el usuario que la mayoría de los existentes XmlDocument-tipos relacionados.

  4. 9

    Suponiendo que tu eres el simple hecho de querer volver a dar formato a un documento XML para crear nuevos nodos de nuevas líneas y añadir sangría, entonces, si usted está utilizando .NET 3.5 o superior entonces la mejor solución es analizar, a continuación, salida con XDocument, algo 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);

    Limpio hu?

    Esto debe cambiar el formato de los nodos XML.

    Para hacer esto con las versiones anteriores del framework requiere mucho más trabajo de campo ya que no hay funciones integradas para re-calcular el espacio en blanco.

    De hecho, para hacer uso de pre-Linq las clases serían:

    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);
  5. 5

    Parece que quieres cargar el XML en una XmlTextWriter objetos y establecer el Formato y la Sangría propiedades:

    writer.Formatting = Formatting.Indented;
    writer.Indentation = 1;
    writer.IndentChar = '\t';
    • He utilizado este enfoque a mí mismo en el pasado (relativamente fácil), pero con .NET 2.0 y posterior, Microsoft recomendar el uso del XmlTextWrtierSettings clase, de modo que usted puede tomar ventaja de las nuevas características añadidas en 2.0 y 3.5. Vea el enlace en mi respuesta.
  6. 4

    Jason enfoque es el más simple. Aquí está el método:

    private static string FormatXmlString(string xmlString)
    {
        System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
        return element.ToString();
    }
    • Bien podría hacer que 1 línea.
  7. 1

    Si lo que necesita para escapar caracteres XML los siguientes pueden ser útiles:

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

    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 añade en la sangría, y mantiene la Declaración Xml.

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

    Es la cadena XML válido? A qué te refieres ¿cómo se puede convertir una cadena XML en un documento XML? Si es así, ¿esto:

    XmlDocument xml = new XmlDocument();
    
    xml.LoadXml( YourString );
    • ¿No ves las otras dos o tres respuestas que dicen exactamente lo mismo?
  10. 0

    Sistema.Xml.Linq.XElement.ToString() Automáticamente Los Formatos!

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

Dejar respuesta

Please enter your comment!
Please enter your name here