




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章XML简介
XML是eXtensibleMarkupLanguage的缩写,即可扩展标记语言。
■XML是由W3C(WorldWideWebConsortium,万维网协会)于1998年2月发布的一种标准,它同HTML一样是SGML(StandardGeneralizedMarkupLanguage,标准通用标记语言)的一个简化子集。11.1XML概述■XML文件是由标记及其所标记的内容构成的文本文件。与HTML不同的是,XML的标记可自由定义,目的是使得XML文件能够很好地体现数据的结构和含义。4举例1:留言板程序的配置文件1、web.xml(建立的项目文件夹为ch9)
<servlet>
<servlet-name>AddMessageServlet</servlet-name>
<servlet-class>message.AddMessageServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ViewMessageServlet</servlet-name>
<servlet-class>message.ViewMessageServlet</servlet-class>
</servlet>
5<servlet-mapping>
<servlet-name>AddMessageServlet</servlet-name>
<url-pattern>/AddMessageServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ViewMessageServlet</servlet-name>
<url-pattern>/ViewMessageServlet</url-pattern>
</servlet-mapping><html>
<!--HTML开始标记--><head>
<!--头标记-->
<title>Java培训</title>
</head>
<!--完结标记--><body>
<!--网页主体--><ul>
<!--非顺序列表-->
<li>李兴华</li>
<!--列表项-->
<ul>
<!--非顺序列表-->
<li>id:001</li>
<!--列表项-->
<li>company:魔乐科技</li>
</ul></ul></body>
</html><!--完结标记-->举例2:使用HTML描述电话本<?xmlversion="1.0"encoding="GB2312"?> <!--头部声明--><addresslist> <!--根节点--> <linkman> <!--子节点--> <name>李兴华</name><!--具体信息--> <id>001</id> <!--具体信息--> <company>魔乐科技<pany> </linkman> <!--子节点完结--></addresslist> <!--根节点完结-->使用XML进行显示返回■HTML作为一种简单的表示性语言,只能显示内容而无法表达数据内容的结构。
■HTML标记不能用来组成树型分层结构的文档,来体现数据之间的逻辑关系。HTML的缺点:
XML具有下述特点:
(1)
XML描述数据的结构性较强。可以使用XML定义分层结构文档。
(2)
XML文档更便于阅读。
XML文件的扩展名必须为“.xml”。
11.2XML语法第一部分:前导区,规定了XML页面的一些属性,在里面有三个属性:version:表示使用的XML版本,现在是1.0;encoding:页面中使用的文字编码,如果有中文的话,则一定要指定编码;standalone:此XML文件是否是独立运行,如果需要进行显示可以使用CSS或者XSL控制。XML文件组成第二部分:数据区,所有的数据区必须有一个根元素,一个根元素下可以存放多个子元素。11.2.1XML文档结构
例如,下面是一个描述书籍信息的XML文档。
【示例文档c11_1.xml】一个简单的XML文档。
<?xmlversion=“1.0”encoding=“GB2312”?>
<!--xml文档名为c11_1.xml-->
<目录>
<书>
<书名>面向对象程序设计——Java</书名>
<作者>张白一,崔尚森</作者>
<出版社>西安电子科技出版社</出版社>
<价格>26.00</价格>
<出版日期>2006年1月</出版日期>
</书>
<书>
<书名>JSP实用案例教程</书名>
<作者>冯燕奎,赵德奎等</作者>
<出版社>清华大学出版社</出版社>
<价格>35.00</价格>
<出版日期>2004年5月</出版日期>
</书>
</目录>
■如果直接用IE浏览器打开XML文件,则显示成如图11.1所示的默认树型结构。
图11.1c11.xml的运行结果返回11.2.2XML声明
■XML声明是以“<?xml”开始,以“?>”结束的。XML声明中可以包含下述三个属性。
1. version属性
■由于当前的XML最新版本是1.0,所以我们一般都写version="1.0"。
2. encoding属性
该属性指定文档中使用的字符编码标准。常用的编码有:
(1)
GB2312或GBK:简体中文编码。
(2)
UTF-8:压缩的Unicode编码。
(3)
BIG5:繁体中文编码。
如果没有声明encoding属性,那么该属性默认为UTF-8编码。
3. standalone属性
该属性可以取值“yes”或“no”,以说明XML文件是否和一个外部文档配套使用。“yes”表示与外部文件无关联。
standalone:单独的
11.2.3XML元素
元素是XML文件内容的基本单元。
■从语法上讲,一个元素包含一个起始标记、一个结束标记以及标记之间的数据内容。
■其使用形式如下:
<标记>数据内容</标记>
例如:
<书名>面向对象程序设计</书名>
■元素中还可以再嵌套别的元素。
■例子c11_1.xml中的元素<目录>中就嵌套了元素<书>,而元素<书>中又嵌套了<书名>、<作者>等元素。
■其中<目录>元素包含了文件中所有的数据信息,称之为根元素。<书>、<书名>、<作者>等这些元素称为XML的标记。
【示例文档c11_1.xml】一个简单的XML文档。
<?xmlversion=“1.0”encoding=“GB2312”?>
<!--xml文档名为c11_1.xml-->
<目录>
<书>
<书名>面向对象程序设计——Java</书名>
<作者>张白一,崔尚森</作者>
<出版社>西安电子科技出版社</出版社>
<价格>26.00</价格>
<出版日期>2006年1月</出版日期>
</书>
<书>
<书名>JSP实用案例教程</书名>
<作者>冯燕奎,赵德奎等</作者>
<出版社>清华大学出版社</出版社>
<价格>35.00</价格>
<出版日期>2004年5月</出版日期>
</书>
</目录>11.2.4XML元素基本语法规则
(1)标记必不可少。
(2)区分大小写。在标记中必须注意区分大小写。在HTML中,标记<table>和<TABLE>是一回事,但在XML中,它们是两个截然不同的标记。
(3)要有正确的结束标记。如果开始标记是<TABLE>,则结束标记应该写作</TABLE>,不能是</table>。
(4)标记要严格配对。例如,HTML中的<BR>、<HR>等单边标记在XML中是不合法的。
(5)空元素标记。空标记就是没有任何数据内容的元素。空元素的语法格式如下:
<标记名></标记名>或<标记名/>
例如:
<价格></价格>
(6)有效使用属性。标记中可以包含任意多个属性。
■在标记中,属性以“名称=取值”的形式出现。名称与取值之间用等号“=”分隔,且取值要用引号引起来。
例如:<MatchTeam=“China”></Match>11.2.5XML的注释
在XML中,注释是以“<!--”开头,以“-->”结束的,这和HTML的注释完全相同。
11.3.1XML文档的根标记
在XML文档中有且仅有一个根标记,其它标记都必须嵌套在根标记之内。
在c11_1.xml文件中,根元素是目录,起始根标记是<目录>,结束根标记是</目录>。
■其内容是两个嵌套的书元素。书元素的起始标记是<书>,结束标记是</书>。每个书元素中又嵌套五个元素,分别是:书名、作者、出版社、价格及出版日期。11.3根标记与特殊字符
【示例文档c11_1.xml】一个简单的XML文档。
<?xmlversion=“1.0”encoding=“GB2312”?>
<!--xml文档名为c11_1.xml-->
<目录>
<书>
<书名>面向对象程序设计——Java</书名>
<作者>张白一,崔尚森</作者>
<出版社>西安电子科技出版社</出版社>
<价格>26.00</价格>
<出版日期>2006年1月</出版日期>
</书>
<书>
<书名>JSP实用案例教程</书名>
<作者>冯燕奎,赵德奎等</作者>
<出版社>清华大学出版社</出版社>
<价格>35.00</价格>
<出版日期>2004年5月</出版日期>
</书>
</目录>11.3.2数据内容中的特殊字符
■在XML中有五种特殊字符:左尖括号“<”、右尖括号“>”、与符号“&”、单引号“‘”、双引号“””。
■W3C制定的规范中规定:数据内容中不能含有特殊字符。要想使用这五种字符,可以通过实体引用。
■XML常用的实体引用如表11.1所示。
表11.1XML常用的实体引用实体实体引用意义lt<<(左尖括号)gt>>(右尖括号)amp&&(与符号)aposapos;‘(单引号)quot"“(双引号)
注意:在XML中实体引用以“&”开始,以“;”结束。
例如,若要输出“&<大学毕业>”这样的内容,就要使用实体引用。在XML文档中应该写成:
<张三>
1970年出生&<大学毕业>
</张三>
解释器解释出该元素的数据是:
1970年出生&<大学毕业>
本节介绍XML文档的三种显示方式,分别是:没有样式表单的显示方式;使用CSS样式表单的显示方式;使用XSL样式表单的显示方式。11.4显示XML文档内容11.4.1显示没有样式表的XML文档
当直接运行XML文件时,IE浏览器只显示如图11.1所示的整个文档的文本,并用不同的颜色来区分文档的不同组成部分。
在每个元素的起始标记的左边有一个“-”号或“+”号。
■“-”号表示该元素的内容已全部展开;
■“+”号表示该元素的内容已收缩。
■单击起始标记左边的“-”号可以收缩元素,而单击已收缩元素旁边的“+”号可以展开它。■例如,如果单击第一个元素<书>旁边的“-”号,就会看到如图11.2所示的内容。
图11.2c11_1.xml收缩元素运行结果11.4.2显示有CSS样式表的XML文档
CSS(层叠样式表)是一种样式表描述规则。
■样式表是用来定义Web页面格局的模板,通过样式表可以定义页面的字体大小及各种背景颜色等。
CSS:CascadingStylesheets
下面举例说明:<?xmlversion="1.0"encoding="GB2312"?> <?xml-stylesheettype=“text/css”href=“test.css”?>
<addresslist>
<linkman>
<name>李兴华</name>
<id>001</id>
</linkman>
</addresslist>举例:test.xmlname
{display:block;
font-size:36pt;
color:blue;
}
id
{display:block;
font-size:24pt;
color:red;
}test.css双击test.xml,出现的效果如下:
1. CSS样式的定义
样式的定义由一个标记的名称和定义这个标记的显示方式的属性列表组成。
■属性包括属性名和属性值。属性的使用格式如下:
标记名
{
属性名1:属性值1;
属性名2:属性值2;
……
属性名k:属性值k;
}
返回
2. CSS样式的使用
为了让XML使用CSS样式,在XML文件中必须加入使用CSS样式的声明。■使用这种声明的一般格式如下:
<?xml-stylesheettype=“text/css”href=“样式表的URI”?>
■例如:<?xml-stylesheettype="text/css"href="c11_2.css"?>
表示样式表文件与当前的XML文件在同一个目录下Identifier标识符
3.示例
【示例文档c11_2.xml】调用c11_2.css的XML文件。
<?xmlversion="1.0"encoding="GB2312"?>
<?xml-stylesheettype="text/css"href="c11_2.css"?>
<!--xml文档程序名为c11_2.xml-->
<张三>
1970年出生&<大学毕业>
</张三>
【示例文档c11_2.css】对c11_2.xml中的标记“张三”定义显示样式,定义的字体大小为36pt和字体加粗。
张三
{
font-size:36pt;
font-weight:bold;
}
双击c11_2.xml文件,运行结果如图11.3所示。
图11.3c11_2.xml的运行结果(书上错了)11.4.3显示有XSL样式表的XML文档
CSS是一种静态的样式描述格式,其本身不遵从XML的语法规范。
■而XSL(eXtensibleStylesheetLanguge,可扩展样式语言)是遵从XML语法规范的XML的一种具体应用,它的功能比CSS强大得多。
1. XML变换的基本步骤
(1)在XML文件中加入使用XSL的声明。
(2)在XSL文件中建立XML文件的样式表。
(3)在XSL文件中将样式表转换成HTML文件。.4所示。
图11.4XML变换的基本步骤
下面用示例来说明。
【示例文档c11_3.xml】一个简单的XML文档。
<?xmlversion="1.0"encoding="GB2312"?>
<?xml-stylesheettype="text/xsl"href="c11_3.xsl"?>
<书>
<书名>面向对象程序设计——Java</书名>
<作者>张白一,崔尚森</作者>
</书>
【示例文档c11_3.xsl】显示c11_3.xml文件的XSL样式表。
<?xmlversion="1.0"encoding="GB2312"?>
<xsl:stylesheetxmlns:xsl="/TR/WD-xsl">
<xsl:templatematch="/">
<HTML><BODY>
<xsl:value-ofselect="书/书名"/>
<BR></BR>
<xsl:value-ofselect="书/作者"/>
</BODY></HTML>
</xsl:template>
</xsl:stylesheet>
运行c11_3.xml文件,其结果如图11.5所示。<xsl:value-ofselect=“书/书名”/>
相当于
<xsl:value-ofselect="书/书名">
</xsl:value-of>
图11.5c11_3.xml的运行结果
XML变换的基本步骤是:当浏览器打开c11_3.xml文件时,浏览器内部的XSL处理器,首先进行XSL变换,将其中的XSL标记
<xsl:value-ofselect="书名"/>
<xsl:value-ofselect="作者"/>
分别转换为
面向对象程序设计——Java
张白一,崔尚森
得到一个如下的HTML文件:
<HTML><BODY>
面向对象程序设计——Java
<BR></BR>
张白一,崔尚森
</BODY></HTML>
然后执行该HTML文件,显示如图11.5所示的结果。
2. XSL样式的使用
为了让XML使用XSL样式,在XML文件中必须加入如下形式的使用XSL样式的声明:
<?xml-stylesheettype=“text/xsl”href=“xsl样式表的URI”?>
例如:样式表文件与XML文件在同一目录。
<?xml-stylesheettype="text/xsl"href="c11_3.xsl"?>
3. XSL样式表结构
XSL样式表结构与XML相似,主要由序言和根标记两个主要部分组成。
■序言中包含XSL声明、处理指令和注释。
■在根标记中嵌入根模板,根模板中可嵌入多个子模板。
■直接用IE浏览器打开XSL文件,显示成默认的树型结构。下面以文档c11-3.xsl为例说明其结构。
(1)序言部分
程序中的序言部分为
<?xmlversion=“1.0”encoding=“GB2312”?>
注意:样式表的编码必须与关联的XML有相同的编码。(2)根标记结构
程序中的根标记结构为
<xsl:stylesheetxmlns:xsl=".org/TR/WD-xsl">
根模板标记
</xsl:stylesheet>
XSL样式表根标记的名称必须是“xsl:stylesheet”。“xmlns:xsl”指明的命名空间.org/TR/WD-xsl表示让浏览器的XSL处理器来实现XSL变换。程序中的根标记结构为
<xsl:stylesheetxmlns:xsl=“./1999/XSL/Transform”>
根模板标记
</xsl:stylesheet>
./1999/XSL/Transform基于推荐标准
./TR/WD-xsl基于工作草案
一般用第一种。改一下书上P315:c11_3.xsl
(3)根模板标记。
XSL处理器首先找到根模板,然后开始XSL变换。程序中的根模板结构为
<xsl:templatematch="/">
根标记模板的内容
</xsl:template>
这里需要注意的是,根模板的匹配模式必须是“/”。
(4)程序中用到的XSL语句。
程序中的XSL语句<xsl:value-ofselect="书/书名"/>是XSL中的赋值语句,表示取出引号中指定的属性值,即取出书元素中书名的值(面向对象程序设计——Java)。程序中用到的XSL语句如表11.2所示。
表11.2程序中用到的XSL语句语句意义xsl:stylesheet样式表根标记的名称xsl:template模板标记xsl:templatematch=“”引号中指定模板的匹配模式xsl:value-ofselect=“”赋值语句,取出引号中指定的属性值xsl:for-eachselect=“”循环语句,取出引号中指定的属性值<?xmlversion="1.0"encoding="GB2312"?>
<?xml-stylesheettype="text/xsl"href="test.xsl"?>
<addresslist>
<linkman>
<name>李兴华</name>
<id>001</id>
</linkman>
</addresslist>举例:test.xml任务:把李兴华设为蓝色<?xmlversion="1.0"encoding="GB2312"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="">
<xsl:templatematch="linkman">
<html><body>
<fontsize="8"color="blue">
<xsl:value-ofselect="name"/>
</font>
</body></html></xsl:template></xsl:stylesheet>test.xsl双击test.xml,出现的界面:<?xmlversion="1.0"encoding="GB2312"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="">
<xsl:templatematch="/">
<html><body>
<fontsize="8"color="blue">
<xsl:value-ofselect="addresslist/linkman/name"/>
</font>
</body></html></xsl:template></xsl:stylesheet>test.xsl第2种方法双击test.xml,其运行界面如下:
前面讲的是编写静态XML页面的方法。静态的XML文档只能表示比较简单的信息,而无法完成比较复杂的客户端与服务器端的交互。本节主要介绍动态生成XML文档的方法。包括用Servlet动态生成XML文档。
11.5XML文档的生成与解释11.5.1用Servlet动态生成XML文档
用Servlet动态生成XML文档的方法,需要下述三个文件:
■一是填写留言信息的HTML文件;
■二是获得留言信息并生成XML文件的Servlet程序;
■三是对XML文件标记进行修饰的XSL文件。
1.填写留言信息的示例文档c11_4_html.html
<!--c11_4_html.html-->
<HTML><HEAD>
<TITLE>messageboard</TITLE>
</HEAD>
<BODY><center>留言板</center>
<FORMaction=“servlet/C11_4_XSL_Servlet"method="POST">
<TABLEborder=1align="center">
<TR><TD>姓名:</TD>
<TD><inputtype="text"name="name"size=25></TD></TR>
<TR><TD>留言:</TD>
<TD><textareaname="content"rows=7cols=25></textarea></TD></TR>
<TR><TDalign="center">
<inputtype="submit"value="确定"></TD>
<TDalign="center"><inputtype="reset"value="重新填写"></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
运行c11_4_html.html程序,填写留言信息,结果如图11.6所示。
图11.6c11_4_html的运行结果
2.获得留言信息,并生成XML文件的Servlet示例程序C11_4_XSL_Servlet.java
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassC11_4_XSL_ServletextendsHttpServlet
{ //重写doPost方法
publicvoiddoPost(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{
//设置服务器输出格式为XML文档
res.setContentType(“text/xml”);
//获得与客户端的浏览器链接的输出流,用于发送输出结果
ServletOutputStreamout=res.getOutputStream();
out.print(“<?xmlversion=\“1.0\”encoding=
\“GB2312\”);
out.println(“standalone=\“no\”?>”);
解释:\表示转义,\”表示引号,上面语句相当于xml文档:
<?xmlversion=“1.0”encoding=“GB2312”standalone=“no”?>
引号前若不加\,则变为
out.print(“<?xmlversion=”1.0);就不对了
out.println(“<?xml-stylesheettype=\“text/xsl\”href=\“c11_4.xsl\”?>”);
解释:相当于xml文档
<?xml-stylesheettype=“text/xsl”href=“c11_4.xsl”?>
href=“c11_4.xsl”表示样式表的URI
out.println(“<message>”);
//”<message>”是根标记
out.println(“<NAME>”);
out.println(req.getParameter(“name”));
out.println(“</NAME>”);
out.println(“<CONTENT>”);
out.println(req.getParameter(“content”));
out.println(“</CONTENT>”);
out.println(“</message>”);
out.close();}//doPost()结束解释:
相当于输出如下XML文件:
<message>
<NAME>王珊</NAME>
<CONTENT>今天去爬山了,不在家</CONTENT>
</message>
//重写doGet方法
publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres) throws
ServletException,IOException
{ doPost(req,res); }
}3.对XML文件标记附加不同样式的XSL示例文件c11_4.xsl
<?xmlversion=“1.0”encoding=“GB2312”?>
<xsl:stylesheetversion=“1.0”xmlns:xsl=“http:/1999/XSL/Transform”>
<xsl:templatematch=“/”>
解释:指定模板的匹配模式必须是“/”,从根元素message开始匹配。
<xsl:for-eachselect=“message”>
解释:循环语句,取出message指定的属性值<HTML><BODY>
<xsl:value-ofselect=“NAME”/>
解释:赋值语句,取出NAME指定的属性值
<BR></BR>
<xsl:value-ofselect="CONTENT"/>
</BODY></HTML>
</xsl:for-each></xsl:template>
</xsl:stylesheet>
运行结果如下面图。图11.7C11_4_XSL_Servlet的运行结果11.5.3使用DOM解析XML文件
XML解析
在XML文件中有很多是描述信息的内容,所以可以利用程序按照里面元素的定义取出对应的内容,这样的操作就称为XML解析,在XML解析中W3C定义了SAX和DOM两种解析方式。DOM
DOM(DocumentObjectModel,文档对象模型),在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。
定义XML文件——dom_demo_01.xml
<?xmlversion="1.0"encoding="GBK"?><addresslist> <linkman> <name>李兴华</name> <email></email> </linkman> <linkman> <name>MLDN</name> <email></email> </linkman></addresslist>形成DOM树在DOM解析中有以下四个核心的操作接口:Document:此接口代表了整个XML文档,表示的是整棵DOM树的根,提供了对文档中的数据进行访问和操作的入口,通过Document节点可以访问XML文件中所有的元素内容。核心操作接口Node:此接口在整个DOM树中具有举足轻重的地位,DOM操作的核心接口中有很大一部分接口是从Node接口继承过来的。例如:Document、Element等接口。在DOM树中,每一个Node接口代表了DOM树中的一个节点NodeList:此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,例如:一个节点的子节点,当文档改变的时候会直接影响到NodeList集合
如果一个程序需要进行DOM解析读操作的话,也需要按照如下的步骤进行:DOM解析过程1、建立DocumentBuilderFactory:DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();2、建立DocumentBuilder:DocumentBuilderbuilder=factory.newDocumentBuilder();3、建立Document:Documentdoc=builder.parse("要读取的文件路径");4、建立NodeList:NodeListnl=doc.getElementsByTagName(“读取结点");进行xml信息读取。<?xmlversion="1.0"encoding="GBK"?><addresslist>
<name>李兴华</name></addresslist>要解析文件——d:\dom_demo_02.xmlpublic
classDOMDemo01{public
static
voidmain(String[]args){
//1、建立DocumentBuilderFactory,以用于取得DocumentBuilder DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();//2、通过DocumentBuilderFactory取得DocumentBuilder DocumentBuilderbuilder=null;
try{builder=factory.newDocumentBuilder();}catch(ParserConfigurationExceptione)读取节点{e.printStackTrace();}
//3、定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
Documentdoc=null;
try{
//读取指定路径的xml文件
doc=builder.parse("D:\\dom_demo_02.xml");}
catch(Exceptione)
{ e.printStackTrace();}
//4、查找name的节点
NodeListnl=doc.getElementsByTagName("name");
//5、输出NodeList中第一个子节点中文本节点的内容
System.out.println("姓名:"+nl.item(0).getFirstChild().getNodeValue());
}
}
nl.item(0).getFirstChild().getNodeValue()主要操作解释:
item(0)表示找到文本结点
getFirstChild表示得到文字结点
getNodeValue表示得到文字结点中的内容■Sun公司推出的JDK1.4及以上版本提供了DOM的Java语言的实现。
■javax.xml.parsers包中提供的DocumentBuilder和DocumentBuilderFactory等类,可以对XML文件进行解析,转换成DOM树。■org.w3c.dom(书上有错,书上为org.xml.dom)包中提供了Document、Node、NodeList、Element、Text等接口,可以创建、遍历、修改DOM树。
为了解析XML文件,DOM规定了各种类型节点之间形成的如图11.8所示的子孙关系。
Document节点代表了整个XML或HTML文档,提供了对文档元素和数据的访问。
■所有其它的节点都以一定的顺序包含在Document中,排成一个树型结构。
图11.8DOM树中节点间的关系
Element元素表示一个XML元素。文档的数据包含在它的元素中。
■元素也可具有提供附加内容信息的属性。它提供许多方法来获取该节点及节点的相关信息。
■Text节点表示的是元素或属性值的文本内容,对应着XML中的数据内容。
下面举例来说明如何使用DOM解析XML文档。
【示例文档c11_5.xml】一个简单的XML文档。
<?xmlversion="1.0"encoding="UTF-8"?>
<!--xml文档程序名为c11_5.xml-->
<目录><书>
<书名>面向对象程序设计</书名>
<作者>张白一,崔尚森</作者>
<出版社>西安电子科技大学出版社</出版社>
<价格>26.00</价格>
<出版日期>2006年1月</出版日期></书>
<书>
<书名>JSP实用案例教程</书名>
<作者>冯燕奎,赵德奎等</作者>
<出版社>清华大学出版社</出版社>
<价格>35.00</价格>
<出版日期>2004年5月</出版日期>
</书>
</目录>
如果用DOM来图形化地表示c11_5.xml文档,则如图11.9所示。
图11.9c11_5.xml的运行结果
【示例程序c11_5.java】用DOM解析c11_5.xml文档的Java程序。
importorg.w3c.dom.*;//XML的DOM实现
importjava.io.*;
importjavax.xml.parsers.*;//XML解析器接口
publicclassC11_5{
publicstaticvoidmain(Stringargs[])
{
try
{
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
//获得一个XML文档的解析器。创建一个解析器工厂对象factory。newInstance()表示获取DocumentBuilderFactory的新实例
DocumentBuilderbuilder=factory.newDocumentBuilder();//解析XML文档生成DOM文档的接口类,以便访问DOM。对象builder代表了具体的DOM解析器。newDocumentBuilder()作用是使用当前配置的参数创建一个新的DocumentBuilder实例。
Documentdocument=builder.parse(newFile(“C11_5.xml”));//Document接口描述了对应于XML文档的文档树,parse(Filef)
将给定文件的内容解析为一个XML文档,并且返回一个新的Document对象
document.normalize();//去掉XML文档中作为空白的不必要的TextNode对象
Elementroot=document.getDocumentElement();//获得根元素,从而利用根结点进行文档的遍历
StringrootName=root.getNodeName();
//得到根元素名
System.out.print("XML文件根节点的名字:"+rootName);
NodeListnodelist=root.getChildNodes();
//获得根元素的子节点列表。
NodeListgetChildNodes()包含此节点的所有子节点的NodeList。
GetElement(nodelist);
//用递归方法实现DOM文档的遍历}//try结束
catch(Exceptione){System.out.println(e);}
}
//main语句结束
publicstaticvoidGetElement(NodeListnodelist)
{intsize=nodelist.getLength();//得到子节点列表的个数
for(inti=0;i<size;i++)
{Nodecnode=nodelist.item(i); //获得子节点列表中的第i个节点
//判断该节点是否是文本节点
if(cnode.getNodeType()==Node.TEXT_NODE)
{ TexttextNode=(Text)cnode;
Stringcontent=textNode.getWholeText(); //获得文本内容
System.out.print(content);
}
//判断该节点是否是元素节点
if(cnode.getNodeType()==Node.ELEMENT_NODE)
{
ElementelementNode=(Element)cnode;
Stringname=elementNode.getNodeName(); //获得元素名字
System.out.print(name+":");
//获得根元素的子节点列表
NodeListnodelist1=elementNode.getChildNodes();
GetElement(nodelist1); //用递归方法实现DOM文档的遍历
}
}
}
}
图11.12是上面两个文件在Eclipse平台中的存放位置的说明(左窗口)和运行的结果(右下窗口)。程序的执行过程:
变量root的值为目录。
NodeListnodelist=Root.getChildNodes()
则得到根元素的子节点列表为{书,书}
再执行GetElement(nodelist);
size=nodelist.getLength();则size为2
Nodecnode=nodelist.item(0)则取出第1个元素:书
判断书是否是文本节点,不是
判断书是否是元素节点,是
ElementelementNode=(Element)cnode;
Stringname=elementNode.getNodeName();
则得到元素名字为:书
然后输出书:
再执行
NodeListnodelist1=elementNode.getChildNodes();
此时得到书的子节点为:{书名,作者,出版社,价格,出版日期}
GetElement(nodelist1);
执行GetElement(Nodelistnodelist)
size=nodelist.getLength();则size为5
Nodecnode=nodelist.item(0)则取出第1个元素:书名
判断书名是否是文本节点,不是
判断书名是否是元素节点,是
ElementelementNode=(Element)cnode;
Stringname=elementNode.getNodeName();
则得到元素名字为:书名
然后输出书名:
再执行
NodeListnodelist1=elementNode.getChildNodes();
此时得到书名的子节点为:{面向对象程序设计}
GetElement(nodelist1);
执行GetElement(Nodelistnodelist)
size=nodelist.getLength();则size为1
Nodecnode=nodelist.item(0)则取出第1个元素:面向对象程序设计
判断”面向对象程序设计”是否是文本节点,是
TexttextNode=(Text)cnode;
Stringcontent=textNode.getWholeText();
得到文本内容,content的值为:面向对象程序设计
然后输出:面向对象程序设计此时返回GetElement(),继续执行GetElement(Nodelistnodelist)
Nodecnode=nodelist.item(1)则取出第2个元素:作者
判断作者是否是文本节点,不是
判断作者是否是元素节点,是
ElementelementNode=(Element)cnode;
Stringname=elementNode.getNodeName();
则得到元素名字为:作者
然后输出作者:
再执行
NodeListnodelist1=elementNode.getChildNodes();
此时得到作者的子节点为:{张白一}
GetElement(nodelist1);执行GetElement(Nodelistnodelist)
size=nodelist.getLength();则size为1
Nodecnode=nodelist.item(0)则取出第1个元素:张白一
判断”张白一”是否是文本节点,是
TexttextNode=(Text)cnode;
Stringcontent=textNode.getWholeText();
得到文本内容,content的值为:张白一
然后输出:张白一
…………
运行c11_6.java的方法运行c11_5.java的方法:
在MyEclipse窗口的左窗格
右击c11_5.java,在快捷菜单中选择RunAs中的JavaApplication即可运行
图11.12c11_6.java的运行结果
c11_6.xml应保存在E:\MyEclipse10\ch11目录下,即工作空间下。Dom4j是上的一个开源项目,在MyEclipse中使用Dom4j,首先要下载Dom4j的JAR包,并将它加载到相应的工程中,加载方法与加载MySQL的驱动程序JAR包类似。我们下载的是dom4j-1.6.1.jar11.5.3使用JSP+Dom4j解析XML文档下面给出用DOM4j解析XML文档的示例程序,它由3个文件组成:
1、待解析的XML文档:c11_6.xml
2、使用DOM4j的Java类:D4jRead.java程序
3、创建类的对象并解析XML文档的JSP程序:c11_6.jsp。
程序运行的结果为这三个文件的内容如下。
<?xmlversion="1.0"encoding="UTF-8"?>
<!--xml文档程序名为c11_6.xml-->
<contents>
<book>
<title>面向对象程序设计——Java</title>
<author>张白一,崔尚森</author>
<press>西安电子科技大学出版社</press>
<price>26.00</price>
c11_6.xml
<date>2006年1月</date>
</book>
<book>
<title>JSP实用案例教程</title>
<author>冯燕奎,赵德奎等</author>
<press>清华大学出版社</press>
<price>35.00</price>
<date>2004年5月</date>
</book>
</contents>
以前学过的Collection、List接口都属于单值的操作,即每次只能操作一个对象,而Map接口与它们不同的是,每次操作的是一对对象,即二元偶对象,Map接口中的每个元素都使用”keyvalue”的形式存储在集合中。
而HashMap是Map接口的常用子类,数据是无序存放的,key不允许重复。HashMap的补充
相关操作实例:向集合中增加和取出内容
在Map接口中使用put(Kkey,Vvalue)方法可以向集合中增加内容,之后可以通过get(Objectkey)方法根据key找出其对应的value.
举例:增加和取得内容(HashMapDemo.java)
importjava.util.HashMap;
importjava.util.Map;
publicclassHashMapDemo{
publicstaticvoidmain(String[]args)
{
HashMap的补充Map<String,String>map=null;
map=newHashMap<String,String>();
map.put(“mldn”);
map.put(“zhinangtuan”,www.);
map.put(“mldnjava”);
Stringval=map.get(“mldn”);
System.out.println(“取出的内容是:”+val);}}
程序运行的结果是:
HashMap的补充packageread;
importjava.io.File;
importjava.util.HashMap;
importjava.util.Iterator;
importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.Element;
importorg.dom4j.io.SAXReader;
//利用dom4j进行XML编程D4jRead.java
publicclassD4jRead{
//HashMap类对象hm存放遍历结果,格式<nodename,nodevalue>
publicvoiditerateWholeXML(Stringfilename,HashMap<String,String>hm)
{SAXReadersaxReader=newSAXReader();
//解析器
try{Documentdocument=saxReader.read(newFile(filename));//读取并解析文件
Elementroot=document.getRootElement();//根节点
int
num=-1;//用于记录目录编号的变量
for(Iterator
iter=root.elementIterator();iter.hasNext();)
{//遍历book结点
Elementelement=(Element)iter.next();解释:for(iter=root.elementIterator();iter.hasNext();)
因为Elementroot,因此elementIterator()是Element类的方法,表示创建一个迭代器对象,包括该元素及其下面的子元素。elementIterator()表示找到下一级元素。
num++;
//遍历book结点的所有孩子结点(即title,author,press,price,date)
for(IteratoriterInner=element.elementIterator();
iterInner.hasNext();)
{ElementelementInner=(Element)iterInner.next();
hm.put(elementInner.getName()+num,elementInner.getText());
}//for
}//for
}//try
catch(DocumentExceptione)
{e.printStackTrace();}
}//方法iterateWholeXML结束
}//类D4jRead结束
程序D4jRead.java中方法iterateWholeXML(Stringfilename,HashMap<String,String>hm)
执行的过程:
先从外部传入要解析的文件c11_6.xml传给filename,另外一个参数hm是本程序生成的参数。
首先Elementroot=document.getRootElement();
即root为{contents},num为-1。
程序D4jRead.java程序执行的过程
然后for(Iterator
iter=root.elementIterator();iter.hasNext();)
{Elementelement=(Element)iter.next();
elementIterator()可以得到contents的下一级元素,即iter为{book,book},element也为{book}
接着,for(IteratoriterInner=element.elementIterator();
iterInner.hasNext();)
{ElementelementInner=(Element)iterInner.next();
element.elementIterator()可以得到下一级元素,即{title},而集合iterInner为{title,author,press,price,date}
程序D4jRead.java程序执行的过程
接着,hm.put(elementInner.getName()+num,elementInner.getText());
向集合hm中添加内容,即向
title0这个键添加值为{面向对象程序设计},
循环第2次,因为iterInner为{title,author,press,price,date}第2个值为author,那么elementInner为{author},执行hm.put(elementInner.getName()+num,elementInner.getText());
即向author0这个键添加值为{张白一,崔尚森}
……,这样就添加了press0,price0,date0等键
程序D4jRead.java程序执行的过程
同理,外循环第2次时,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025黑龙江哈尔滨工程大学发展计划处、学科专业建设办公室管理岗位招聘2人考前自测高频考点模拟试题及参考答案详解一套
- 2025贵州毕节市七星关区招聘城市社区工作者186人考前自测高频考点模拟试题及答案详解(考点梳理)
- 祖国的美丽课件
- 2025年度湖北省纪委监委考试录用公务员专业测试模拟试卷及完整答案详解1套
- DB22-T 5098-2016 混凝土空心砌块砌体结构排水检查井技术规程
- 祖国特产课件
- 2025福建福州第八中学生辅老师1人考前自测高频考点模拟试题及答案详解(全优)
- 2025年中国镰状细胞病治疗行业政策、市场规模及投资前景研究报告(智研咨询发布)
- 2025年4月广东深圳市第二特殊教育学校面向2025年应届毕业生赴外招聘教师4人模拟试卷含答案详解
- 2025湖南岳阳鼎盛建设投资开发有限公司招聘拟聘用人员模拟试卷完整参考答案详解
- GB/T 46256-2025生物基材料与制品生物基含量及溯源标识要求
- 社交APP用户社群运营创新创业项目商业计划书
- 2025年互联网医疗市场份额动态趋势研究报告
- 2025至2030铝合金行业市场深度分析及竞争格局与行业项目调研及市场前景预测评估报告
- 医院中医科常见病症诊疗规范
- 2025广东广州市白云区民政局招聘窗口服务岗政府雇员1人笔试备考试题及答案解析
- 《电子商务概论》(第6版) 教案 第11、12章 农村电商;跨境电商
- 车辆改装施工方案模板
- 到梦空间使用讲解
- 大象牙膏教学课件
- 【《老年高血压患者护理措施研究》6600字(论文)】
评论
0/150
提交评论