Em C #, qual é o melhor método para formatar uma string como XML?

Eu estou criando um editor leve em c # e gostaria de saber o melhor método para converter uma seqüência em uma seqüência XML bem formatada. Espero que exista um método público na biblioteca C # como “public bool FormatAsXml (texto de string, formatado em string stringXmlText)”, mas não poderia ser tão fácil, poderia?

Muito especificamente, qual seria o método “SomeMethod” que produziria a saída abaixo?

string unformattedXml; string formattedXml; unformattedXml = "Lewis, CSThe Four Loves" formattedXml = SomeMethod(unformattedXml); Console.WriteLine(formattedXml); 

Saída:

   Lewis, CS The Four Loves  

 string unformattedXml = "< ?xml version=\"1.0\"?>Lewis, CSThe Four Loves"; string formattedXml = XElement.Parse(unformattedXml).ToString(); Console.WriteLine(formattedXml); 

Saída:

  Lewis, CS The Four Loves  

A declaração Xml não é saída por ToString (), mas é por Save () …

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

Saída:

 < ?xml version="1.0" encoding="utf-8"?>  Lewis, CS The Four Loves  

Infelizmente não, não é tão fácil quanto um método FormatXMLForOutput, isso é o que a Microsoft estava falando aqui;)

De qualquer forma, a partir do .NET 2.0, a abordagem recomendada é usar o XMlWriterSettingsClass para configurar a formatação, ao contrário de definir propriedades diretamente no object XmlTextWriter. Veja esta página do MSDN para mais detalhes. Diz:

“No lançamento do .NET Framework versão 2.0, a prática recomendada é criar instâncias XmlWriter usando o método XmlWriter.Create e a class XmlWriterSettings. Isso permite que você aproveite ao máximo todos os novos resources apresentados nesta versão. Para obter mais informações, consulte Criando Escritores XML. ”

Aqui está um exemplo da abordagem recomendada:

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

Usando o novo namespace System.Xml.Linq (System.Xml.Linq Assembly), você pode usar o seguinte:

 string theString = "blah"; XDocument doc = XDocument.Parse(theString); 

Você também pode criar um fragment com:

 string theString = "blah"; XElement element = XElement.Parse(theString); 

Se a string ainda não é XML, você pode fazer algo assim:

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

Algo a se notar neste último exemplo é que o XElement irá codificar em XML a string fornecida.

Eu recomendo as novas classs XLINQ. Eles são mais leves e mais fáceis de usar que a maioria dos tipos relacionados ao XmlDocument existentes.

Supondo que você esteja simplesmente querendo reformatar um documento XML para colocar novos nós em novas linhas e adicionar indentação, então, se você estiver usando o .NET 3.5 ou superior, a melhor solução é analisar e, em seguida, gerar com o XDocument, algo como:

 string unformattedXml; string formattedXml; unformattedXml = "< ?xml version=\"1.0\"?>Lewis, CSThe Four Loves"; formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToString(); Console.WriteLine(formattedXml); 

Puro hu?

Isso deve então reformatar os nós XML.

Fazer isso com versões anteriores do framework requer muito mais trabalho, já que não há funções embutidas para recalcular o espaço em branco.

De fato, fazer isso usando classs pré-Linq seria:

 string unformattedXml; string formattedXml; unformattedXml = "< ?xml version=\"1.0\"?>Lewis, CSThe Four Loves"; 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); 

Parece que você deseja carregar o XML em um XmlTextWriter objects e definir as propriedades de formatação e recuo:

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

A abordagem de Jason é a mais simples. Aqui está o método:

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

Se você só precisa escaping de caracteres XML, o seguinte pode ser útil:

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

No Framework 4.0, é simples.

 var unformattedXml = "< ?xml version=\"1.0\"?>Lewis, CSThe Four Loves"; var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml); var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "\r\n" : "") + xdoc.ToString(); Console.WriteLine(formattedXml); 

Isso adiciona o recuo necessário e mantém a declaração Xml .

 < ?xml version="1.0"?>  Lewis, CS The Four Loves  

A string é XML válida? Você quer dizer como você pode converter uma string XML em um documento XML? Se assim for, faça isso:

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

System.Xml.Linq.XElement.ToString () automaticamente formatos!

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