Monday, February 27, 2012

如何将XML内容用HTML格式表述

在不同平台的数据交流,XML是一种常用的文件。XML是Extended Markup Language,既扩展的描述语言。XML可以用来表述各种数据。随着XML越来越流行,许多软件都有将数据转换为XML的格式。但是作为阅读数据来说,XML格式还是不很直观和方便的。

这里我通过我工作中的一个实例来介绍一种将XML格式中有关的数据取出,以HTML的方式来表示。这种方式通常称为XML Transformation,既XML转换。我认为这是一个十分实用的技术,当然这需要学习一些有关XML, XSLT, XPATH等有关技术的基本知识。

XML文件


我最近在工作中使用微软的SQL Server Profiler来分析一应用软件与一数据库之间的数据交流。下面是我得到的纪录数据:



这里的数据是一种列表的方式,纪录许多事件的有关数据。我所关心的是CPU, Reads, Writes and Durations。SQL Server profiler提供一种方式将这些数据存为XML的文件。



上面是我用Notepad打开XML文件的内容。实际上这个文件十分简单,根节点是TracedData,我所关心的紧接下面的节点是Events,之下是Event,在众多的Event节点中,我所关心的是具有属性(attribute)的name="SQL:BatchComplteded",在这个节点下面的是一组Column。Column中有各种数据,我所关心的是属性为:name="CPU", "Reads", "Writes"和"Duration"的数据。

使用XSL和XPath进行转换


XSL(Extended Stylesheet Language )是一种用于描述XML文件内容格式的语言,采用它对XML进行转换则称为XSL Transformation,既采用XSL对XML进行转换;而XPath是一种用于搜索和选择XML中节点的语言,既描写XML内部数据的路径。一般来说,在XSL中采用XPath来描写和搜索所关心的节点。

下面就是我的XSL文件myHTMLConvert.html,文件的主要目的是将我所关心的XML数据转换为HTML表格的表达方式。


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
  <body>
    <form method="post" action="edittool.asp">
    <h2>SQL Server Profiler Result</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>CPU</th>
        <th>Reads</th>
        <th>Duration</th>
        <th>Writes</th>
      </tr>
      <xsl:for-each select="TraceData/Events/Event[@name='SQL:BatchCompleted']">
      <tr>
        <td>
          <xsl:value-of select="Column[@name='CPU']"/>
        </td>
        <td>
          <xsl:value-of select="Column[@name='Reads']"/>
        </td>
        <td>
          <xsl:value-of select="Column[@name='Duration']"/>
        </td>
        <td>
          <xsl:value-of select="Column[@name='Writes']"/>
        </td>
      </tr>
      </xsl:for-each>
    </table>
  </form>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

其中xls:就是用来标示XSL语言,其中采用XPath来搜索XML中的节点,比如说xls:for-each select就是搜索所有的节点,进行循环处理。其中搜索的内容就是 TraceData/Events/Event[@name='SQL:BatchCompleted'],这就是一种XPath:寻找所有符合这种路径的节点,每个节点用/分开,用[...]来进行节点的限制。再如xsl:value-of select="Column[@name='CPU']"是选择Column节点的文字,其节点的属性必须满足name="CPU"

用网页浏览器来浏览结果


有了源XML码和XSL转换码,就可以对XML进行转换了。既然结果是HTML,网络浏览器自然是最好的方式来显示其结果。

为了使用XSL来对XML进行转换,一种简单的方式是在XML文件的开始加入一个link,指定转换的XSL连接。比如下面是我的XML文件的开始部分,其中第二行就是用来指定转换的XSL文件:

<?xml version="1.0" encoding="utf-16"?>
<?xml-stylesheet type="text/xsl" href="myHTMLConvert.xsl"?>

将XML和XSL文件放在同一文件夹中,这样一切都准备好了。下面是将XML文件拽到IE中的结果:



可是我发现,当我采用谷歌的Chrome浏览器,结果却是空白!


结果我发现,这个问题是因为Chrome的安全性设置不让使用当地的任何用户文件,因此XSL文件无法打开。这一点可以在Inspect Element菜单中可以看到(在浏览网页中右击鼠标,从菜单中选择Inspect Element):



不过我很快就找到了答案,Chrome有一个选择参数-disabled-web-security,可以用来指定非安全性模式设置。下面是我在桌面做了一个快捷Chrome,专门用于这一目的:



注意:如果XML文件中有namespace的定义,最好将此删除或改名使其无法生效,因为namespace会对XML的节点产生不同的定义,这样XPath就可能无法找到所搜索的节点。留意下面的例子中,我将XML文件开始的xmlns改名使其无法使用。

XML Notepad免费软件


这是我最喜欢用的一个软件,来自微软免费工具软件,用它可以很方便地查看XML中的节点和属性设置等。



结果我后来发现,这个工具还有一个XML输出的功能(第二个Tab: XML Output):



使用这个软件的优点是,不必在XML文件中加XSL的link,而且可以选择不同的XSL文件对XML进行转换。

参考


No comments:

Post a Comment