在不同平台的数据交流,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的文件。
使用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的安全性设置不让使用当地的任何用户文件,因此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进行转换。
参考
- W3Schools: XSLT Transformation
- Peter Beverloo 博文: List of Chromium Command Line Switches(Chrome的选项)
- Microsoft: XML Notepad Download (软件下载)
No comments:
Post a Comment