2010-01-27 16 views
6

Ho dati xml che sto tornando alla mia vista. Lo sto mettendo in una textarea, ma questo lo mostra non formattato. Come posso formattare l'xml per la visualizzazione nella mia vista?Come visualizzare XML formattato

Visualizzerò l'xml solo in una parte della pagina, quindi non posso consentire a IE di visualizzarlo. Voglio che sia in formato indent standard xml.

+4

Come lo vuoi formattato? –

+0

Vorrei che i tag fossero rientrati. – Joe

+1

In tal caso, fare riferimento alla risposta my o John Saunders. –

risposta

6

È sufficiente caricare l'XML in XElement, quindi utilizzare XElement.ToString().

+0

+1 per semplicità – Joe

+1

Nessun rientro, e l'OP ha chiesto che – Grubl3r

4

È possibile utilizzare uno XSLT per convertire il codice XML in XHTML e quindi visualizzarlo.

2

come sostituire "<" con & lt; e poi riempire un pre> block <. L'utente non sarà in grado di modificarlo ma sicuramente hai strumenti migliori di una textarea per quello comunque, giusto?

1

È possibile utilizzare il colorizer del codice di script java. per quanto riguarda la formattazione, xml writer (come so) può produrre documenti ben strutturati, può essere disattivato di default per ridurre il peso.

5

Se, da "formattazione", vuoi dire frastagliata allora si può caricare in XmlDocument e lo scrive in un XmlWriter inizializzato con una XmlWriterSettings che ha Indent insieme a true.

private string FormatXml(string input) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(input); 

    using (StringWriter buffer = new StringWriter()) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 

     using (XmlWriter writer = XmlWriter.Create(buffer, settings)) 
     { 
      doc.WriteTo(writer); 

      writer.Flush(); 
     } 

     buffer.Flush(); 

     return buffer.ToString(); 
    } 
} 
+0

-1: 'XmlTextWriter' è deprecato da .NET 2.0. Ti mancano anche blocchi 'using'. –

+1

'XmlTextWriter' non è sicuramente deprecato da .NET 4.0. È semplicemente * consigliato * che venga usato 'XmlWriter.Create' al posto di XmlTextWriter. Ho aggiornato il codice per disporre delle risorse, anche se all'inizio era solo un esempio. –

+0

se si utilizza "@user", informa l'utente del commento. Ho rimosso il downvote. il codice "solo un campione" viene copiato e incollato. Ho anche visto spesso persone che mi hanno chiesto "perché l'hai scritto in quel modo", rispondi, "a causa dell'esempio". –

1

Se siete alla ricerca di una semplice struttura Xml la visualizzazione di IE di default (con i nodi pieghevoli, ecc).

La trasformazione IE è qui: res://msxml.dll/DEFAULTSS.xsl.

Una versione xslt è disponibile online in luoghi come this. Lo uso in luoghi in cui non ho una trasformazione più umana, ma voglio comunque vedere l'Xml in modo formattato.

3

Ecco cosa mi piace fare:

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" standalone="yes" omit-xml-declaration="yes" 
    encoding="utf-8" media-type="text/html" indent="no" cdata-section-elements="" 
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> 

<xsl:template match="/"> 
    <html><head><title>XML Data</title> 
    <style type="text/css">th {text-align:right}</style></head> 
    <body><table><xsl:apply-templates/></table></body></html> 
</xsl:template> 

<xsl:template match="*[text() and *]"> 
    <xsl:apply-templates select="@*"/> 
    <tr><th><xsl:value-of select="name()"/></th> 
     <td> 
      <xsl:for-each select="*|text()"> 
       <xsl:choose> 
        <xsl:when test="name()"> 
         <xsl:apply-templates mode="inline" select="."/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="."/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </td> 
    </tr> 
</xsl:template> 

<xsl:template match="*" mode="inline"> 
    <xsl:text> [ </xsl:text> 
    <strong><xsl:value-of select="name()"/></strong> 
    <xsl:if test="@*"> 
     <xsl:text> (</xsl:text> 
     <xsl:for-each select="@*"><xsl:if test="position() &gt; 1" xml:space="preserve"> </xsl:if> 
      <em><xsl:value-of select="name()"/></em> = <xsl:value-of select="."/> 
     </xsl:for-each> 
     <xsl:text>)</xsl:text> 
    </xsl:if> 
    <xsl:text>: </xsl:text> 
    <xsl:apply-templates mode="inline"/> 
    <xsl:text> ] </xsl:text> 
</xsl:template> 

<xsl:template match="*[text() and not(*)]"> 
    <xsl:apply-templates select="@*"/> 
    <tr><th><xsl:value-of select="name()"/></th> 
     <td><xsl:apply-templates/></td></tr> 
</xsl:template> 

<xsl:template match="*[(* or @*) and not(text())]"> 
    <tr><td colspan="2"><fieldset><legend><xsl:value-of select="name()"/></legend> 
     <table><xsl:apply-templates select="@*"/><xsl:apply-templates/></table></fieldset></td></tr> 
</xsl:template> 

<xsl:template match="*[not(*|@*|text())]"> 
    <tr><td colspan="2"><xsl:value-of select="name()"/></td></tr> 
</xsl:template> 

<xsl:template match="@*"> 
    <tr><th><em><xsl:value-of select="name()"/></em></th> 
     <td><xsl:value-of select="."/></td></tr> 
</xsl:template> 

</xsl:stylesheet> 
3

dichiararti un asp:Literal all'interno di un elemento <pre>.

<pre><asp:Literal ID="foo" runat="server" /></pre> 

assegnare la stringa XML al letterale:

foo.Text = CreatedIndentedXmlString("<foo><bar>6</bar></foo>"); 

public string CreatedIndentedXmlString(string inXml) 
{ 
    if (inXml.Length == 0) return ""; 
    XElement x = XElement.Parse(inXml); 
    return Server.HtmlEncode(x.ToString()); 
} 
Problemi correlati