2010-01-27 18 views
6

Tengo datos xml que estoy volviendo a mi vista. Lo estoy poniendo en un área de texto, pero esto lo muestra sin formato. ¿Cómo puedo formatear el xml para visualizar en mi vista?Cómo mostrar XML formateado

Voy a mostrar el xml en solo una parte de la página, por lo que no puedo dejar que IE lo muestre. Quiero que esté en formato sangrado xml estándar.

+4

¿Cómo quieres que el formato? –

+0

Me gustaría que las etiquetas se sangren. – Joe

+1

En ese caso, consulte mi respuesta o la de John Saunders. –

Respuesta

6

Simplemente cargue el XML en un XElement, luego use XElement.ToString().

+0

+1 por simplicidad – Joe

+1

Sin embargo, sin sangría, y el OP pidió eso – Grubl3r

4

Puede usar un XSLT para convertir su XML en XHTML y luego mostrar eso.

2

¿qué hay de reemplazar "<" con & lt; y luego rellenar en un bloque pre> <. El usuario no podrá editarlo, pero seguramente tendrá mejores herramientas que un área de texto para eso de todos modos, ¿verdad?

1

Puede utilizar el colorizador de código de script java. en cuanto al formateo, xml writer (como sé) puede generar un documento bien estructurado, se puede desactivar por defecto para reducir el peso.

5

Si, por el "formato", que quiere decir con sangría a continuación, puede cargarlo en XmlDocument y escribirlo en un XmlWriter inicializado con un XmlWriterSettings que tiene Indent conjunto de 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' está en desuso desde .NET 2.0. También te faltan bloques 'using'. –

+1

'XmlTextWriter' ciertamente no está en desuso desde .NET 4.0. Es simplemente * recommended * que se utiliza 'XmlWriter.Create' en lugar del ctor de XmlTextWriter. Actualicé el código para deshacerme de los recursos, aunque para empezar solo era una muestra. –

+0

si usa "@user", informa al usuario del comentario. He eliminado el voto negativo. El código "solo una muestra" se copia y pega. También he visto frecuentemente a la gente preguntando, "¿por qué lo escribiste de esa manera?", Responde "a causa de la muestra". –

1

Si está buscando una estructura simple de XML la opinión del IE por defecto (con los nodos plegables, etc.).

La transformación IE está aquí: res://msxml.dll/DEFAULTSS.xsl.

Una versión xslt está disponible en línea en lugares como this. Utilizo esto en lugares donde no tengo una transformación más humana, pero aún quiero ver el Xml de forma formateada.

3

Esto es lo que me gusta hacer:

<?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

Declárese un asp:Literal dentro de un elemento <pre>.

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

asignar la cadena XML al literal:

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