在ASP.NET页面上显示XML

时间:2009-05-27 05:44:57

标签: asp.net

我有一个包含使用LinqtoXML

的XML文档的字符串

在asp.net页面上显示它的最佳方式是什么。

5 个答案:

答案 0 :(得分:17)

我本来希望丹尼斯提到的方式(使用<asp:Xml>控件)。但这需要使用XSL样式表来格式化XML。 Xml控件不允许将HTML编码的字符串作为DocumentContent属性传递,也不允许任何方法对内容进行编码。

正如我在Dennis发表的评论中所提到的,msxml.dll中包含的defaultss.xsl不公开(并且不符合XSL 1.0)。但是,在此处发布了一个公开转换的版本:http://www.dpawson.co.uk/xsl/sect2/microsoft.html#d7615e227。我已经对它进行了测试,虽然有点马车,但仍然有效。

因此,我认为最简单的方法是使用<asp:Literal>控件将预编码的XML输出到页面。以下示例演示了此方法:


<%@ Page Language="C#" %>

<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Xml" %>

<script runat="server">
  protected void Page_Load(object sender, EventArgs e)
  {
    string theXML = Server.HtmlEncode(File.ReadAllText(Server.MapPath("~/XML/myxmlfile.xml")));
    lit1.Text = theXML;
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <pre>
        <asp:Literal ID="lit1" runat="server" />
      </pre>
    </div>
  </form>
</body>
</html>

答案 1 :(得分:6)

asp:Xml控件与此Default Stylesheet一起用作TransformSource。这将使您看起来非常类似于在Internet Explorer中打开xml文件时所看到的与语法高亮和着色完全相似的内容。

我删除了展开/折叠节点功能,因为我无法使其工作。这个文件是xsl 1.0,并且在我没有错误的情况下运行良好。

为了避免我的链接文件出现任何问题,以下是内容:

<!--
|
| XSLT REC Compliant Version of IE5 Default Stylesheet
|
| Original version by Jonathan Marsh (jmarsh@xxxxxxxxxxxxx)
| http://msdn.microsoft.com/xml/samples/defaultss/defaultss.xsl
|
| Conversion to XSLT 1.0 REC Syntax by Steve Muench (smuench@xxxxxxxxxx)
|
+-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no" method="html"/>
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="processing-instruction()">
    <DIV class="e">
        <SPAN class="b">
            <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
        </SPAN>
        <SPAN class="m">
            <xsl:text>&lt;?</xsl:text>
        </SPAN>
        <SPAN class="pi">
            <xsl:value-of select="name(.)"/>
            <xsl:value-of select="."/>
        </SPAN>
        <SPAN class="m">
            <xsl:text>?></xsl:text>
        </SPAN>
    </DIV>
</xsl:template>
<xsl:template match="processing-instruction('xml')">
    <DIV class="e">
        <SPAN class="b">
            <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
        </SPAN>
        <SPAN class="m">
            <xsl:text>&lt;?</xsl:text>
        </SPAN>
        <SPAN class="pi">
            <xsl:text>xml </xsl:text>
            <xsl:for-each select="@*">
                <xsl:value-of select="name(.)"/>
                <xsl:text>="</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>" </xsl:text>
            </xsl:for-each>
        </SPAN>
        <SPAN class="m">
            <xsl:text>?></xsl:text>
        </SPAN>
    </DIV>
</xsl:template>
<xsl:template match="@*">
    <SPAN>
        <xsl:attribute name="class"><xsl:if test="xsl:*/@*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
        <xsl:value-of select="name(.)"/>
    </SPAN>
    <SPAN class="m">="</SPAN>
    <B>
        <xsl:value-of select="."/>
    </B>
    <SPAN class="m">"</SPAN>
</xsl:template>
<xsl:template match="text()">
    <DIV class="e">
        <SPAN class="b"> </SPAN>
        <SPAN class="tx">
            <xsl:value-of select="."/>
        </SPAN>
    </DIV>
</xsl:template>
<xsl:template match="comment()">
    <DIV class="k">
        <SPAN>
            <!--<A STYLE="visibility:hidden" class="b" onclick="return false" onfocus="h()">-</A>-->
            <SPAN class="m">
                <xsl:text>&lt;!--</xsl:text>
            </SPAN>
        </SPAN>
        <SPAN class="ci" id="clean">
            <PRE>
                <xsl:value-of select="."/>
            </PRE>
        </SPAN>
        <SPAN class="b">
            <xsl:call-template name="entity-ref">
                <xsl:with-param name="name">nbsp</xsl:with-param>
            </xsl:call-template>
        </SPAN>
        <SPAN class="m">
            <xsl:text>--></xsl:text>
        </SPAN>
        <SCRIPT>f(clean);</SCRIPT>
    </DIV>
</xsl:template>
<xsl:template match="*">
    <DIV class="e">
        <DIV STYLE="margin-left:1em;text-indent:-2em">
            <SPAN class="b">
                <xsl:call-template name="entity-ref">
                    <xsl:with-param name="name">nbsp</xsl:with-param>
                </xsl:call-template>
            </SPAN>
            <SPAN class="m">&lt;</SPAN>
            <SPAN>
                <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                <xsl:value-of select="name(.)"/>
                <xsl:if test="@*">
                    <xsl:text> </xsl:text>
                </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
                <xsl:text>/></xsl:text>
            </SPAN>
        </DIV>
    </DIV>
</xsl:template>
<xsl:template match="*[node()]">
    <DIV class="e">
        <DIV class="c">
            <!--<A class="b" href="#" onclick="return false" onfocus="h()">-</A>-->
            <SPAN class="m">&lt;</SPAN>
            <SPAN>
                <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                <xsl:value-of select="name(.)"/>
                <xsl:if test="@*">
                    <xsl:text> </xsl:text>
                </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
                <xsl:text>></xsl:text>
            </SPAN>
        </DIV>
        <DIV>
            <xsl:apply-templates/>
            <DIV>
                <SPAN class="b">
                    <xsl:call-template name="entity-ref">
                        <xsl:with-param name="name">nbsp</xsl:with-param>
                    </xsl:call-template>
                </SPAN>
                <SPAN class="m">
                    <xsl:text>&lt;/</xsl:text>
                </SPAN>
                <SPAN>
                    <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                    <xsl:value-of select="name(.)"/>
                </SPAN>
                <SPAN class="m">
                    <xsl:text>></xsl:text>
                </SPAN>
            </DIV>
        </DIV>
    </DIV>
</xsl:template>
<xsl:template match="*[text() and not (comment() or processing-instruction())]">
    <DIV class="e">
        <DIV STYLE="margin-left:1em;text-indent:-2em">
            <SPAN class="b">
                <xsl:call-template name="entity-ref">
                    <xsl:with-param name="name">nbsp</xsl:with-param>
                </xsl:call-template>
            </SPAN>
            <SPAN class="m">
                <xsl:text>&lt;</xsl:text>
            </SPAN>
            <SPAN>
                <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                <xsl:value-of select="name(.)"/>
                <xsl:if test="@*">
                    <xsl:text> </xsl:text>
                </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
                <xsl:text>></xsl:text>
            </SPAN>
            <SPAN class="tx">
                <xsl:value-of select="."/>
            </SPAN>
            <SPAN class="m">&lt;/</SPAN>
            <SPAN>
                <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                <xsl:value-of select="name(.)"/>
            </SPAN>
            <SPAN class="m">
                <xsl:text>></xsl:text>
            </SPAN>
        </DIV>
    </DIV>
</xsl:template>
<xsl:template match="*[*]" priority="20">
    <DIV class="e">
        <DIV STYLE="margin-left:1em;text-indent:-2em" class="c">
            <!--<A class="b" href="#" onclick="return false" onfocus="h()">-</A>-->
            <SPAN class="m">&lt;</SPAN>
            <SPAN>
                <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                <xsl:value-of select="name(.)"/>
                <xsl:if test="@*">
                    <xsl:text> </xsl:text>
                </xsl:if>
            </SPAN>
            <xsl:apply-templates select="@*"/>
            <SPAN class="m">
                <xsl:text>></xsl:text>
            </SPAN>
        </DIV>
        <DIV>
            <xsl:apply-templates/>
            <DIV>
                <SPAN class="b">
                    <xsl:call-template name="entity-ref">
                        <xsl:with-param name="name">nbsp</xsl:with-param>
                    </xsl:call-template>
                </SPAN>
                <SPAN class="m">
                    <xsl:text>&lt;/</xsl:text>
                </SPAN>
                <SPAN>
                    <xsl:attribute name="class"><xsl:if test="xsl:*"><xsl:text>x</xsl:text></xsl:if><xsl:text>t</xsl:text></xsl:attribute>
                    <xsl:value-of select="name(.)"/>
                </SPAN>
                <SPAN class="m">
                    <xsl:text>></xsl:text>
                </SPAN>
            </DIV>
        </DIV>
    </DIV>
</xsl:template>
<xsl:template name="entity-ref">
    <xsl:param name="name"/>
    <xsl:text disable-output-escaping="yes">&amp;</xsl:text>
    <xsl:value-of select="$name"/>
    <xsl:text>;</xsl:text>
</xsl:template>
</xsl:stylesheet>

答案 2 :(得分:3)

c#解决方案 那对我有用:

string encodedXml = String.Format("<pre>{0}</pre>", HttpUtility.HtmlEncode(xmlStr));
testLb.Text = encodedXml;

答案 3 :(得分:0)

div中的HTML PRE标签,只是回显出正确转义的字符串?

Div为您提供对齐/格式化,而PRE应保留空白

答案 4 :(得分:0)

不使用XML控件显示XML格式化代码

这是一个VB.NET解决方案:

Public Shared Function FormatXml(ByVal xmlDoc As XmlDocument) As String  
    Dim sb As New StringBuilder()  
    `'We will use stringWriter to push the formated xml into our StringBuilder sb.`  
    Using stringWriter As New StringWriter(sb)  
        `'We will use the Formatting of our xmlTextWriter to provide our indentation.`  
        Using xmlTextWriter As New XmlTextWriter(stringWriter)  
            xmlTextWriter.Formatting = Formatting.Indented  
            xmlDoc.WriteTo(xmlTextWriter)  
        End Using
    End Using
    Return sb.ToString()
End Function

使用此功能设置多行TextBox或Label的文本:

XmlViewTextBox.Text = FormatXml(xmlDoc)

如果您尝试使用XML字符串,请先将其转换为XmlDocument:

Dim xmlDoc As New XmlDocument
xmlDoc.LoadXml(xmlString)

此解决方案将在HTML页面上呈现XML代码,同时保留换行符和缩进。