Как отобразить форматированный XML - PullRequest
6 голосов
/ 27 января 2010

У меня есть XML-данные, которые я возвращаю в свое представление. Я помещаю это в текстовую область, но это отображает это неформатированным. Как я могу отформатировать XML для отображения в моем представлении?

Я буду отображать xml только в части страницы, поэтому я не могу позволить IE отобразить его. Я хочу, чтобы он был в стандартном формате с отступом XML.

Ответы [ 8 ]

6 голосов
/ 27 января 2010

Просто загрузите XML в XElement, затем используйте XElement.ToString().

6 голосов
/ 27 января 2010

Если под «форматированием» вы подразумеваете отступ, то можете загрузить его в XmlDocument и записать его в XmlWriter , инициализированный XmlWriterSettings , который имеет Отступ установлен на 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();
    }
}
4 голосов
/ 27 января 2010

Вы можете использовать XSLT , чтобы конвертировать XML в XHTML и затем отобразить его.

3 голосов
/ 07 сентября 2012

Объявите себя asp:Literal в элементе <pre>.

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

Назначить строку xml литералу:

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());
}
3 голосов
/ 27 января 2010

Вот что мне нравится делать:

<?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>
2 голосов
/ 27 января 2010

как насчет замены "<" на & lt; а затем набивать в <pre>блок. Пользователь не сможет редактировать его, но у вас наверняка есть инструменты лучше, чем текстовая область, верно?

1 голос
/ 27 января 2010

Если вы ищете простую структуру Xml, то IE по умолчанию (с разборными узлами и т. Д.).

Преобразование IE находится здесь: res: //msxml.dll/DEFAULTSS.xsl.

Версия xslt доступна онлайн в таких местах, как this . Я использую это в тех местах, где у меня нет более человеческого преобразования, но я все еще хочу увидеть XML в отформатированном виде.

1 голос
/ 27 января 2010

Вы можете использовать java-скрипт colorizer. Что касается форматирования, XML Writer (как я знаю) может выводить хорошо структурированный документ, его можно отключить по умолчанию для уменьшения веса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...