日期:2014-05-16  浏览次数:20402 次

JSTL XML processing标签库(2)

在企业级应用越来越依赖XML的今天,XML格式的数据被作为信息交换的优先选择。XML processing标签库为程序设计者提供了基本的对XML格式文件的操作。在该标签库中的标签一共有10个,被分为了三类,分别是:
q???????? XML核心标签:<x:parse>、<x:out>、<x:set>。
q???????? XML流控制标签:<x:if>、<x:choose>、<x:when>、<x:otherwise>、<x:forEach>。
q???????? XML转换标签:<x:transform>、<x:param>。
由于该组标签库专注于对某一特定领域的实现,因此本书将只选择其中常见的一些标签和属性进行介绍。
9.4.1 用于解析XML文件的<x:parse>标签
<x:parse>标签是该组标签库的核心,从其标签名就可以知道,它是作为解析XML文件而存在的。它的属性和描述如表9.12所示:
表9.12 <x:parse>标签属性和说明
属性?描述?
doc?源XML的内容,该属性的内容应该为String类型或者java.io.Reader的实例,可以用xml属性来替代,但是不被推荐?
var?将解析后的XML保存在该属性所指定的变量中,之后XML processing标签库中的其他标签若要取XML中的内容就可以从该变量中得到(可选)?
scope?变量的作用范围(可选)?
varDom?指定保存的变量为org.w3c.dom.Document接口类型(可选)?
scopeDom?org.w3c.dom.Document的接口类型变量作用范围(可选)?
systemId?定义一个URI,该URI将被使用到XML文件中以接入其他资源文件(可选)?
filter?该属性必须为org.xml.sax.XMLFilter类的一个实例,可以使用EL表达式传入,将对XML文件做过滤得到自身需要的部分(可选)?
其中,var、scope和varDom、scopeDom不应该同时出现,而应该被视为两个版本来使用,二者的变量都可以被XML processing标签库的其他标签来使用。
<x:parse>标签单独使用的情况很少,一般会结合XML processing标签库中的其他标签来一起工作。下面看一个示例。
首先给出一个简单的XML文件,将对该XML文件做解析,该XML文件名为SampleXml.xml。
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
???????? <name>RW</name>
???????? <passWord>123456</passWord>
???????? <age>28</age>
???????? <books>
?????????????????? <book>book1</book>
?????????????????? <book>book2</book>
?????????????????? <book>book3</book>
???????? </books>
</xml-body>
标签库的工作:
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/ >
<x:parse var="xmlFilue" doc="${xmlFile}"/>
该示例读取XML文件得到了<c:import>标签的帮助,<c:import>标签将源XML文件的内容保存在 “xmlFile”变量中,<x:parse>标签根据“xmlFile”变量的值解析“SampleXml.xml”。

9.4.2 用于显示XML内容的<x:out>标签
<x:out>标签从<x:parse>标签解析后保存的变量中取得需要的XML文件内容,并显示在页面上。该标签是通过XPath技术(定位XML元素的一种技术)来实现的。要使用<x:out>标签必须将xalan-j的jar包 保存在“WEB-INF/lib ”下。它的属性和描述如表9.13所示:
表9.13 <x:out>标签属性和说明
属性?描述?
select?XPath表达式?
escape?当特殊字符如:“<,>,&,’,””出现在取得的结果字符串中时,将以转义字符来替换?
<x:out>标签需要与<x:parse>标签协同工作,下面看一个示例。
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/ >
<x:parse var="xmlFilue" doc="${xmlFile}"/>
name:<x:out select="$xmlFilue/xml-body/name"/><br>
passWord:<x:out select="$xmlFilue/xml-body/passWord"/><br>
age:<x:out select="$xmlFilue/xml-body/age"/><br>
读取XML文件并解析后的变量xmlFilue将加上“$”作为XPath表达式的开头,select中的表达式将从xml-body根元素下的各个子元素中取得实体内容,最后将结果显示在页面上。根据“SampleXml.xml”文件的内容,将显示。
name:RW
passWord:123456
age:28
9.4.3 用于保存XML内容的<x:set>标签
<x:set>标签允许将某个源XML中元素的实体内容或属性,保存到一个变量中去,它的实现也依靠XPath技术。它的属性和描述如表9.14所示:
表9.14 <x:set>标签属性和说明
属性?描述?
select?XPath表达式?
var?保存结果的变量名?
scope?变量的作用范围(可选)?
<x:set>标签的var保存的变量由XPath的结果决定该变量的类型,下面看一个示例。
<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/ >
<x:parse var="xmlFilue" doc="${xmlFile}"/>
<x:set select="$xmlFilue/xml-body/name" var="thisName"/>
这里将保存XML的name元素内容到变量“thisName”中。
9.4.4 用于判断的<x:if>标签
<x:if>标签允许由XPath的boolean()函数得到的判断结果,来判断是否显示其标签所包含的内容。<x:if>标签的属性与<x:set>标签相同,但是var的结果只能是boolean类型。
9.4.5 用于复杂判断的<x:choose>、<x:when>、<x:otherwise>标签
这组标签将一起使用,来提供“if elseif”语句的功能。
<x:choose>标签没有属性,可以被认为是父标签,<x:when>、<x:otherwise>将作为其子标签来使用。
<x:when>标签等价于“if”语句,它包含一个select属性,该属性为XPath判断表达式。
<x:otherwise>标签没有属性,它等价于“else”语句。
9.4.6 用于对XML元素循环的 <