2009-02-26 11 views
5

C'è un modo per prendere una stringa xml in .net e renderla più facile da leggere? quello che voglio dire è posso convertire questo:Rendi più leggibile xml

<element1><element2>some data</element2></element1> 

a questo:

<element1> 
    <element2> 
     some data 
    </element2> 
</element1> 

c'è qualche costruito in classe per questo? come sql server 2005 sembra rimuovere tutta la formattazione su xml per risparmiare spazio o qualcosa ...

risposta

16

Se si sta utilizzando .NET 3.5, è possibile caricare come un XDocument e poi basta chiamare ToString() che lo indenterà in modo appropriato. Per esempio:

using System; 
using System.Xml.Linq; 

public class Test 
{ 
    static void Main() 
    { 
     string xml = "<element1><element2>some data</element2></element1>"; 

     XDocument doc = XDocument.Parse(xml); 
     xml = doc.ToString(); 
     Console.WriteLine(xml); 
    } 
} 

Risultato:

<element1> 
    <element2>some data</element2> 
</element1> 

Se si scrive in un file o di altra corrente, quindi XDocument.Save sarà (per impostazione predefinita) il rientro troppo.

(credo XElement ha tutte le stesse caratteristiche, se non si ha realmente bisogno di un XDocument.)

+0

Ho questa app nella mia directory \ bin, si chiama "xmlpp" per XML pretty-print. inestimabile. – Cheeso

5

Come salvare/scrivere l'XML in un file?

È possibile creare un XmlWriter e passarlo un'istanza XmlWriterSettings, in cui si imposta la proprietà Rientro a true:

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 

XmlWriter writer = XmlWriter.Create (outputStream, settings); 
+0

bene in questo momento io non scrivere in un file ho appena mostrarlo in un messagebox così tutto ho ottenuto è una stringa .. – Peter

+1

@Petoj - fine; scriverlo su StringWriter, quindi chiamare ToString() su StringWriter –

1

È possibile caricare la stringa in un oggetto XDocument e salvarla nuovamente in una stringa:

XDocument doc = XDocument.Load(new StringReader(xmlString)); 
StringWriter writer = new StringWriter(); 
doc.Save(writer); 
string readable = writer.ToString(); 

che vi darà l'xml formattato in questo modo:

<?xml version="1.0" encoding="utf-16"?> 
<element1> 
    <element2>some data</element2> 
</element1> 
0

Prima di tutto, si hanno taggato C# e VB.NET entrambi. Quindi la mia risposta sarà per entrambi.

È possibile definire la funzione che ottiene la stringa XML come parametro nel tipo di stringa.

Diciamo;

è stata creata una funzione di:

[VB]

Private Function PrettyXML(XMLString As String) As String  
     Dim sw As New StringWriter() 
     Dim xw As New XMLWriter(sw) 
     xw.Formatiing = Formatting.Indented 
     xw.Indentation = 4 

     Dim doc As New XMLDocument 
     doc.LoadXML(XMLString) 
     doc.Save(xw) 
     Return sw.ToString()  
End Function 

Poi si può simpyl chiamare questa funzione come:

Dim myXML As String = "<element1><element2>some data</element2></element1>" 
Dim myPrettyXML As String 
myPrettyXML = PrettyXML(myPrettyXML) 

[C#]

Private String PrettyXML(string XMLString) 
    { 
     StringWriter sw = new StringWriter(); 
     XMLTextWriter xw = new XmlTextWriter(sw); 
     xw.Formatiing = Formatting.Indented; 
     xw.Indentation = 4; 
     XmlDocument doc = new XmlDocument(); 
     doc.Save(xm); 
     return sw.ToString(); 
    } 

Quindi puoi semplicemente chiamare t la sua funzione è:

string myXML = "<element1><element2>some data</element2></element1>"; 
string myPrettyXML = ""; 
myPrettyXML = PrettyXML(myPrettyXML); 

NOTA: non ho provato la versione C#, ma dovrebbe funzionare.

Spero che questo aiuti ..

+0

FYI, non dovresti usare 'new XmlTextReader()' o 'new XmlTextWriter()'. Sono stati deprecati da .NET 2.0. Usa invece 'XmlReader.Create()' o 'XmlWriter.Create()'. –

+0

Inoltre, come va meglio delle altre risposte, alcune di quattro anni fa? –

+1

@JohnSaunders questo ha una cosa che le altre risposte non ti permettono di specificare quanti spazi usare per indentare, non la contrassegnerò come la risposta dopo tutto questo tempo ma il suo mosto un +1! – Peter