65.9K
CodeProject 正在变化。 阅读更多。
Home

美观的 XML 查看器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2017 年 8 月 2 日

CPOL
viewsIcon

9884

为 Web 应用程序(或其他需求)创建一个美观的 XML 查看器

引言

需要向用户展示简化且带有颜色标记的 XML,以 PDF 格式呈现——这让我开始在 Google 上搜索。但没有找到正确的答案:如何创建美观的可视化 XML?

背景

主要思路是使用 XSLT,简单快捷地生成 HTML,然后可以将 HTML 显示给用户或打印(转换为)PDF 格式。由于我有一个将 HTML 转换为 PDF 的例程——我所需要的只是正确的 XML 转换。

Using the Code

var xmlFile = contentExtractedDir.GetFiles("*.xml").FirstOrDefault();
if (xmlFile != null)
{
    XElement contentXml = null;
    using (var s = xmlFile.OpenRead())
    {
        contentXml = XElement.Load(s);
    }
    xslt = new System.Xml.Xsl.XslCompiledTransform();
    xslt.Load(Server.MapPath("App_Data/default.XML.xslt"));
    var output = new StringBuilder();
    xslt.Transform(contentXml.CreateReader(), null, new StringWriter(output));
    // CreatePDFHelper makes PDF routine which can create PDFs from HTML
    var pdfHelper = (new Core(base.Context)).CreatePDFHelper();
    var outputPdf = pdfHelper.ConvertHtmlToBytes(output.ToString());
}

而且——我找不到的最重要的事情——**正确的 XML 转换**

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.w3.org/TR/REC-html40" version="1.0">
    <xsl:output method="html" omit-xml-declaration="yes" 
    encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>
        <html>
            <head>
                <meta http-equiv="content-type" 
                content="text/html; charset=utf-8" />
                <title>XML data</title>
            </head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="*">
        <xsl:choose>
            <xsl:when test="*">
                <div style="font-weight: normal; 
                color: #323296;">&lt;<xsl:value-of select="local-name()"/>&gt;
                </div>
                <div style="margin-left: 8px;">
                <xsl:apply-templates select="node()"/>
                </div>
                <div style="font-weight: normal; 
                color: #323296;">&lt;/<xsl:value-of select="local-name()"/>&gt;
                </div>
            </xsl:when>
            <xsl:otherwise>
                <div style="font-weight: normal; color: #643232;">&lt;
                <xsl:value-of select="local-name()"/>&gt;
                <span style="font-weight: bold; color: #326432;">
                <xsl:value-of select="text()"/></span>
                &lt;/<xsl:value-of select="local-name()"/>&gt;</div>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
© . All rights reserved.