JSP~~JSTL~~XML标签库

9 篇文章 0 订阅

XML 提供了非常灵活的方式来表示结构化的数据,可以创建自己的标记来识别数据,不仅仅人可以看懂,而且计算机也可以读懂。并且 XML 可以在不兼容的系统之间进行数据的交换,所以 XML 必定将称为最普遍的数据操作和数据传输的工具。这也注定它能成为 Web 应用程序中极具引力的集成技术之一。
JSTL 标准标签库已经提供了一些关于 XML 操作的标签,使得 JSP 开发者可以在不深入了解 SAX(Simple API for XML)和 DOM(Document Object Model,即文件对象模式)等技术条件就可以处理XML 文件。
在 XML 操作过程如下:
(1)先实现<c:import>标签把要处理的 XML 文件检索到,
(2)使用<x:parse>标签来解析这个文件,<x:parse>标签支持标准的 XML 解析技术,例如文件对象模式(DOM)和简单的XML API(SAX)技术。
(3)标签<x:transform>标签可以使用来转换 XML 文件,它使用的是扩展样式语言(Extensible Stylesheet Language,简称 XSL)技术。

关于 XML 的标签库还提供了很多标签来处理解析后的 XML 数据,其中就使用到了一种标准――XML 路径语言(XML Path Language,XPath),用来引用和读取解析后的 XML 文件中的数据。

1 XPath介绍

XPath 标准是用来对 XML 文档各部分数据进行定位的语言。它除了提供了一套定位语法之外,还包括一些函数,可以提供基本的数字运算、布尔运算以及字符串处理等功能。
XPath 使用了一种紧凑和非 XML 的语法来方便地实现 XPath 在 XML 属性值中使用,它基于 XML文档的逻辑结构,在该结构中进行导航。除了用于定位,XPath 自身还包含了一个子集用于进行匹配,还可以用来验证一个节点是否匹配某个模式。XPath 是把一个 XML 文档看成一个树和节点的模式。节点的类型可以有多种,其中包括元素节点、属性节点和文本节点。
XPath 的基本语法由表达式构成。在计算机表达式的值后面生成一个对象,这个对象有以下四种基本类型:
节点集(Node Set)、布尔数值、数字型、字符串类型
XPath 基本上和文件系统中查找文件相类似,如果路径是以“/”开头的,则表示该路径是一个决定路径,这和在 UNIX 操作系统中关于文件路径的定义是一致的。
当然了 XPath 它本身有自己的一套完整的语法说明来进行 XML 文件的定位。
这里不列出所有严格的定义表达式,而是使用一些实例来说明如何使用 XPath 语言。

1.1 “/”和“//”的使用

“/”是表示当前文档的节点,类似 DOS 目录分割符,“//”则表示当前文档所有的节点。类似查看整个目录。
(1)/authors/author:
表示选择根目录下、父节点为 authors 的元素“author”。

(2)/authors/author/name:
表示查找到所有名称为“name”的元素,但是它的父节点为“author”,而“author”的父节点又为“authors”。

(3)//name:表示查找 XML 文件中的所有“name”元素,而无论这个元素在什么层次。

1.2 “*”的使用

”标记表示某个层次上的所有元素。
(1)/authors/author/

表示在 author 元素(它的父节点为 authors)下的所有子元素(本例为 name和 nationality 两个元素)。

(2)/authors/*/name:
表示查找所有名为 name 的元素,而不管它的父节点是谁,或者是 author,也或者是 super-author 元素,但是再上一个父节点确必须是 authors 元素。

(3)//*:表示查找到所有元素。

1.3 路径分支

方括号表示路径分支。
(1)/authors/author[nationality]/name:
表示只查找那些在 authors 元素下包含 nationality 子元素的author 元素的 name 节点。

(2)authors/author[nationality=’Russian’]/name:
表示查找那些 nationality 子元素值为 German 的 author元素下的 name 节点,而且 author 元素的父节点为 authors。

1.4 xml的案例

address.xml

<?xml version="1.0" encoding="GBK"?>
<addresslist>
	<linkman>
		<name id="yjy">杨剑勇</name>
		<email>yjy@cslg.cn</email>
	</linkman>
</addresslist>

2 XML核心动作标签

包括的核心动作标签有如下几个:
<x.parse>:用于解析 XML 文件。
<x.out>:通过 XPath 来读取 XML 文件中的某元素。
<x:set>:该标签用来计算 XPath 表达式,并且把结果保存在指定的变量当中

2.1 <x:parse>标签

该标签的使用格式如下:

<x:parse doc="XMLDocument" [var="varName"] [scope="scope"] | [varDom="varName"] [scopeDom="scope"]
   [systemId="systemId"] [filter=”filter"] />

标签中的各属性描述如下:
doc:指定要解析的 XML 文件。一般使用<c:import>检索到相应的 XML 文件。
var:把解析之后的 XML 文件存储在 var 属性指定的变量中。
scope:设置 var 属性指定的变量有效范围。
varDom:存储解析后的 XML 文件。
scopeDom:设置 varDom 属性指定变量的有效范围。
systemId:指定 XML 文件的 URI。
filter:对应的是 org.xml.sax.XMLFilter 类。

使用<x:parse>标签的案例

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL: XML -- Parse解析 XML</title></head>
<c:set var="xmlText">
  <a>
   <b><c>good</c> </b>
   <d><c>baby</c></d>
</a>
</c:set>

<x:parse var="xmlDoc" doc="${xmlText}" />
<x:out select="$xmlDoc//c"/><br>
<x:out select="$xmlDoc/a/d"/><br>
<x:out select="$xmlDoc/a/*"/><br>
</body>
</html>

该程序中,首先使用<c:set>定义一个 xml 文件内容,并保存在 xmlText 变量中,然后通过<x:parse>标签对这个 XML 文件内容进行解析。最后使用<x:out>标签和指定的 XPath 表达式来查找 XML 文件的元素。运行结果:

good
baby
good 

2.2 <x:out>标签

该标签是用于计算 XPath 表达式,然后把查找到的元素进行输出。其一般的使用格式如下:

<x:out select="XPathExpression" [escapeXml="true|false"] />

属性说明如下:
select:将要计算的 XPath 表达式。
escapeXml:确定<、>、&、’、”这些字符是否被转换成字符实体代码,默认为 true。

使用<x:out>的案例

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL_XML_out</title></head>
<body>
	<c:import var="add" url="address.xml" charEncoding="GBK"/>
	<x:parse var="addressXml" doc="${add}"/>
	<h3>姓名:<x:out select="$addressXml/addresslist/linkman/name"/>
	(编号:<x:out select="$addressXml/addresslist/linkman/name/@id"/></h3>
	<h3>邮箱:<x:out select="$addressXml/addresslist/linkman/email"/></h3>
</body>
</html>

运行结果:

姓名:杨剑勇 (编号:yjy)
邮箱:yjy@cslg.cn

2.3 <x:set>标签

该标签首先计算 XPath 表达式,然后把计算的结果保存在指定的变量中,而不是输出。<x:set>标签的一般使用格式如下:

<x:set select="XPathExpression"  var="varName" [scope="page|request|session|application"] />

标签中各属性描述如下:
select:将要被计算的 XPath 表达式。
var:把 XPath 表达式计算之后的值保存在这个属性所指定的变量中,以后可以通过指定的变量 来引用这个值。
scope:设置 var 属性所指定变量的有效范围。

使用<x:set>的案例

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL_XML_Set</title></head>
<body>
	<c:import var="add" url="address.xml" charEncoding="GBK"/>
	<x:parse var="addressXml" doc="${add}"/>
	<x:set var="nameXml" scope="page" select="$addressXml/addresslist/linkman"/>
	<h3>姓名:<x:out select="$nameXml/name"/></h3>
</body>
</html>

运行结果:

姓名:杨剑勇

3 XML的流程控制动作

用于 XML 流程控制的标签包括:<x:if><x:choose><x:when><x:otherwise> <x:forEach>
这些标签和核心标签库中的<c:if>、<x:choose>、<x:otherwise>以及<x:forEach>非常相似,不同的只是 XML 流程控制标签使用的是 XPath 表达式。

3.1 <x:if>标签

通过计算 select 属性指定的 XPath 表达式是否为正,即如果 XPath 表达式指定的元素存在则为正,否则为假,然后根据判断结果决定是否输出<x:if>体中的代码程序或者表达式。<x:if>标签使用格式如下:

<x:if select="XPathExpression" var="varName" [scope="page|request|session|application"] />

如果这个标签有一个体,使用格式如下:

<x:if select="XPathExpression" [var="varName"] cope="page|request|session|application"] >
	Body content
</x:if>

属性描述如下:
select:指定的 XPath 表达式,如果这个表达式指定的元素存在返回 true,否则返回 false。
var:保存判断的结果,true 或者 false。
scope:设置 var 属性指定变量的范围。

使用<x:if>的案例

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL_XML_if</title></head>
<body>
	<c:import var="add" url="address.xml" charEncoding="GBK"/>
	<x:parse var="addressXml" doc="${add}"/>
	<x:if select="$addressXml//name/@id='yjy'">
		<h3>存在编号是yjy的信息,姓名:<x:out select="$addressXml/addresslist/linkman/name"/></h3>
	</x:if>
</body>
</html>

运行结果是:

存在编号是yjy的信息,姓名:杨剑勇

3.2 <x:choose><x:when>和<x:otherwise>标签

这三个标签一般配套使用,与核心标签库中的流程控制标签一样,<x:when>和<x:otherwise>作为子标签嵌套在<x:choose>标签体中。这三个标签的一般组合使用格式如下:

<x:choose>
  <x:when select="XPathExpression">
 	Body content1
  </x:when>
  ..............
  <x:otherwise>
 	Conditional block
  </x:otherwise>
</x:choose>

使用<x:choose><x:when><x:otherwise>的案例

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL_XML_Choose</title></head>
<body>
	<c:import var="add" url="address.xml" charEncoding="GBK"/>
	<x:parse var="addressXml" doc="${add}"/>
	<x:choose>
		<x:when select="$addressXml//name/@id='yjyyjy'">
			<h3>编号是yjy的名称是:<x:out select="$addressXml/addresslist/linkman/name"/></h3>
		</x:when>
		<x:otherwise>
			<h3>啥也不是了!</h3>
		</x:otherwise>
	</x:choose>
</body>
</html>

运行结果是:

啥也不是了!

3.3 迭代标签<x:forEach>

<x:forEach>标签首先通过计算 select 属性所指定的 XPath 表达式,然后把得到的元素集合作迭代处 理。
基本使用格式如下:

<x:forEach [var="varName"] select="XPathExpression">
	body content
</x:forEach>

使用<x:forEach>的案例

新建一个xml文件,用来可以循环信息

<?xml version="1.0" encoding="GBK"?>
<addresslist>
	<linkman>
		<name id="yjy">杨剑勇</name>
		<email>yjy@cslg.cn</email>
	</linkman>
	<linkman>
		<name id="kf">客服中心</name>
		<email>cslg@163.com</email>
	</linkman>
	<linkman>
		<name id="hr">招聘中心</name>
		<email>cslgrsc@163.com</email>
	</linkman>
</addresslist>

使用<x:forEach>读取内容

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<html>
<head><title>JSTL</title></head>
<body>
	<c:import var="add" url="alladdress.xml" charEncoding="GBK"/>
	<x:parse var="addressXml" doc="${add}"/>
	<x:forEach select="$addressXml//linkman" var="linkman">
		<h3>姓名:<x:out select="name"/>(编号:<x:out select="name/@id"/></x:forEach>
</body>
</html>

运行结果:

姓名:杨剑勇(编号:yjy) 
姓名:客服中心(编号:kf) 
姓名:招聘中心(编号:hr) 

4 XML的转换动作

XML 标签库提供的 XML 转换动作标签使得 XML 文件以 XSLT 可扩展样式表(它是一种用于 XML文件转换的语言,作为 Web 应用的一种表示层技术已经非常流行)转换成为了可能。转换动作主要使用到了两个标签:
<x:transform>:用于把 XML 文件转换成 XSLT 格式。
<x:param>:和<x:transform>配套使用,用于传递参数。

4.1 <x:transform>标签

与<x:parse>标签情况一样,<x:transform>标签支持多种不同的格式。<x:transform>最基本的格式的语法是:

<x:transform xml="expression" xslt="expression"   var="name" scope="scope" 
           xmlSystemId="expression" xsltSystemId="expression">
<x:param name="expression" value="expression"/>
...
</x:transform>

格式说明:
此处, 属性规定要被转换的文件, 属性规定定义这次转换的样式表xmlxslt(文件后缀为“.xsl” 。)这两种属性是必要的,其他属性为可选。
与<x:parse>的 xml 属性一样,<x:transform>的 xml 属性值可以是包含 XML 文件的字符串,或者 是 接 入 这 类 文 件 的 Reader 。 此 外 , 它 还 可 以 采 用 org.w3c.dom.Document 类 或javax.xml.transform.Source 类的实例格式。最后,它还可以是使用<x:parse>操作的 var 或 varDom属性分配的变量值。
另外,还可以根据<x:transform>操作的主体内容来包含要被转换的 XML 文件。在这种情况下,<x:transform>的语法是:

<x:transform xslt="expression" var="name" scope="scope" xmlSystemId="expression" xsltSystemId="expression">
  body content(XML document)
<x:param name="expression" value="expression"/>
...
</x:transform>

格式说明:
在这两种情况下,规定 XSL 样式表的 xslt 属性应是字符串、Reader 或 javax.xml.transform.Source实例。
如 果 var 属性 存 在 , 转 换 后 的 XML 文 件 将 分 配 给 相 应 的 var 属 性指 定 的 变 量 , 作 为org.w3c.dom.Document 类的一个实例。通常,scope 属性规定这类变量分配的范围。
<x:transform>标记还支持将转换结果存储到 javax.xml.transform.Result 类的一个实例中,而不是作为org.w3c.dom.Document 的一个实例。如果 var 和 scope 属性被省略,result 对象规定作为 result 属性的值,<x:transform>标记将使用该对象来保存应用该样式表的结果。下面介绍了使用<x:transform>的 result 属性的这两种语法的变化:

<x:transform xml="expression" xslt="expression" result="expression" xmlSystemId="expression" 
                                                                    xsltSystemId="expression">
	<x:param name="expression" value="expression"/>
...
</x:transform>
<x:transform xslt="expression"   result="expression"  xmlSystemId="expression" xsltSystemId="expression">
	body content(XML document)
<x:param name="expression" value="expression"/>
...
</x:transform>

格式说明:无论您采用这两种<x:transform>格式中的那一种,您都必须从定制标记单独创建javax.xml.transform.Result 对象。该对象自身作为 result 属性的值提供。
如果既不存在 var 属性,也不存在 result 属性,转换的结果将简单地插入到 JSP 页面,作为处理<x:transform>操作的结果。当样式表用于将数据从 XML 转换成 HTML 时尤其有用,如下所示:

<c:import var="rssFeed" url="http://slashdot.org/slashdot.rdf"/>
<c:import var="rssToHtml" url="/WEB-INF/xslt/rss2html.xsl"/>
<x:transform xml="${rssFeed}" xslt="${rssToHtml}"/>

在本例中,使用<c:import>标记来读取 RSS 反馈和适当的样式表。样式表的输出结果是 HTML,通过忽略<x:transform>的 var 和 result 属性来直接显示。
与<x:parse>的 systemId 属性一样,<x:transform>的 xmlSystemId 和 xsltSystemId 属性用于解析 XML文件中相关的路径。在这种情况下,xmlSystemId 属性应用于根据标记的 xml 属性值提供的文件,而xsltSystemId 属性用于解析根。

4.2<x:param>标签

该标签是用来给<x:transform>标签传递参数,并且是嵌套在<x:transform>标签体中。它基本的格式语法有如下两种:
(1)传递的参数变量值在“value”属性中设置:

<x:param name="”varname" value="value"/>

(2)传递的参数值在标签体中指定:

<x:param name="varname">
   Parameter value
</x:param>

5 XML文件元素查找案例

<?xml version="1.0" encoding="UTF-8"?>
<games>
  	<country id="Luxembourg">
		<athlete>
 			<name>Lux1</name>
 			<sport>swimming</sport>
 			<age>23</age>
 			<gender>M</gender>
		</athlete>

		<athlete>
 			<name>Lux2</name>
 			<sport>wrestling</sport>
 			<age>31</age>
 			<gender>M</gender>
		</athlete>
	</country>
  
  	<country id="Denmark">
		<athlete>
			<name>Den 1</name>
 			<sport>cycling</sport>
 			<age>18</age>
 			<gender>F</gender>
		</athlete>
		<athlete>
 			<name>Den 2</name>
 			<sport>sailing</sport>
 			<age>27</age>
 			<gender>M</gender>
		</athlete>
  	</country>
</games>
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<html>
<head><title>JSTL: XML -- Parse / Out</title></head>
<body>
<h3>parse 和 out 标签的实例</h3>
<!--引入 games.xml 文件-->
<c:import var="docString" url="games.xml"/>
<x:parse var="doc" doc="${docString}"/>

<table ><tr >
	<td  valign="top">
		<table border="1px"><tr>
		<td valign="top"><pre><c:out value="${docString}"/></pre></td>
		<td valign="top"></td> 
		</tr></table>
	</td>
	
	<td valign="top">
		<table border="1px">
		<tr><th>XPath 表达式</th> <th>查找到的元素</th></tr>
		<tr><td>$doc/	/sport</td><td><x:out select="$doc//sport"/><br></td></tr>
		<tr><td>$doc/games/country/ *</td> 
		<td><x:out select="$doc/games/country/*"/><br></td></tr>
		<tr><td>$doc/games/country</td>
			<td><pre><x:out select="$doc/games/country"/></pre></td></tr>
		<tr><td>$doc/games/country[last()]</td>
			<td><pre><x:out select="$doc/games/country[last()]"/></pre></td></tr>
		<tr> <td>$doc/ /@id </td>
				<td><pre><x:out select="$doc//@id"/></pre></td></tr>
		<tr><td>$doc/ /country[@id='Denmark']</td> 
			<td><pre><x:out select="$doc//country[@id='Denmark']"/></pre></td></tr>
		<tr><td>$doc/ / *</td> 
			<td><pre><x:out select="$doc//*"/></pre></td></tr>
		 </table>	
	</td>
</tr></table>
</body>
</html>

运行结果是:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值