一、dom4j 介绍
解析XML 文件的开源组件。下载地址:http://sourceforge.net/projects/dom4j,建议下载dom4j 2.0-RC.jar,一个jar包走天下。
二、dom4j在JSP 中基础使用
1、生成xml 文件
主要用到包中的以下类:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;//工具类,用于取得生成Document 对象,该对象代表xml 文件
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;//控制输出的xml 的格式
import org.dom4j.io.XMLWriter;//输出流示例:
public class SimpleBookXmlHanlder {
public static void main(String[] args) throws IOException {
Document doc=DocumentHelper.createDocument();
Element books=DocumentHelper.createElement("books");
doc.setRootElement(books);
Element book1=books.addElement("book");
Element name1=book1.addElement("name");
name1.setText("红楼梦");
Element author1=book1.addElement("author");
author1.setText("曹雪芹");
Element book2=books.addElement("book");
Element name2=book2.addElement("name");
name2.setText("西游记");
Element author2=book2.addElement("author");
author2.setText("吴承恩");
//通过源码发现Document对象的setXMLEncoding方法没具体作用
//应该用OutputFormat 对象的setEncoding 方法设置编码格式
doc.setXMLEncoding("GBK");
OutputFormat format= new OutputFormat();
format.setEncoding("GBK"); //默认以utf-8编码输出
format.setIndent(true); //是否采用缩进
format.setNewlines(true); //一个元素占一行
File xmls= new File(System.getProperty("user.dir")+"/xmls");
if(!xmls.isDirectory()||!xmls.exists()){
xmls.mkdir();
}
//java 中将文件分为文件夹与文件两大类
File xml=new File(xmls.getAbsolutePath(),"books.xml");
XMLWriter writer=new XMLWriter(new FileWriter(xml),format);
writer.write(doc);
writer.flush();
writer.close();
System.out.println("完成");
}
}注:实际中的xml应该是动态生成的,即从数据库查询出数据,生成xml,再传给客户端
结果:books.xml
<?xml version="1.0" encoding="GBK"?>
<books>
<book>
<name>红楼梦</name>
<author>曹雪芹</author>
</book>
<book>
<name>西游记</name>
<author>吴承恩</author>
</book>
</books>
//Document 对象方法
public Element getRootElement();
//Element 对象方法
public Element element(String name);//通过指定节点名称获取该元素的子节点
public List<Element> elements(String name);//获取所有子元素
3、修改节点
dom4j 中的添加修改节点只指添加与删除元素、属性或内容,而非在原来就基础上修改相关属性。
(1)、查找节点
//Element 对象方法
public Element selectSingleNode(String xpathExpression);//获取唯一的节点时
public List<Element> selectNodes(String xpathExpression);说明:
xpathExpression:以"/"作为子元素与父元素的分隔符,若以"/"开头,则表示使用绝对路径。可使用属性作为判断条件。如:
Element nameNodes=book1.selectSingleNode("book1/name[@attr=10]");//假设name节点有个属性值为10的attr属性。建议:最好别用属性。
(2)、删除节点
主要方法:
//Element 对象方法
public void remove(Element ele);
public void remove(Text text);
public void remove(Attribute attr);
public void remove(Comment comm);
public void remove(CDATA cdata);
(3)、添加节点
add 系列方法。配合前两类方法,共同达到修改某个节点的目的。
4、获取节点属性值、内容
attribute(String attrName)、attributeValue(String attrName)、valueOf()等,第一个方法的属性名是指定在创建的命名空间中的属性名。
三、基础实践
1、向客户端输出xml 数据
关键代码:
XMLWriter writer = new XMLWriter(response.getWriter(),format);
writer.write(doc);//doc 为Document dom4j中国Document 类实例。
writer.flush();
writer.close();说明:内容类型选择:text/html、text/xml、text/plain
2、AJAX 请求服务器上 xml文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
String xmlURL=request.getContextPath();
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>向服务器请求xml</title>
</head>
<body>
说明:
<p>XML 是用于服务器端保存数据的,这些数据可来自提交的表单、数据库等。没有方法直接将xml 文件发送给客户端,
只能通过AJAX 方式,或将xml 文件内容转换为对应字符串,再在客户端解析。</p>
<p>服务器端只能通过servlet 输出 xml内容</p>
<form action="<%=xmlURL %>/requestXML" method="get">
<input type="submit" value="servlet中输出xml内容"/>
</form>
<button onclick="getXml()">AJAX请求books.xml文件</button>
<div>AJAX请求结果xml文件解析后结果:
<div id="showXML"></div>
</div>
<script type="text/javascript">
function getXml(){
var xhr;
if(window.XMLHttpRequest){
xhr=new XMLHttpRequest();
}
else{
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("GET","xmls/books.xml",true);
xhr.onreadystatechange=function(){
var bookNames="";
if(xhr.readyState==4&&xhr.status==200){
alert("接受成功");
var books=xhr.responseXML.getElementsByTagName("book");
for(var i=0;i<books.length;i++){
bookNames+=books[i].childNodes[1].childNodes[0].nodeValue;
alert("书名:"+bookNames);
}
document.getElementById("showXML").innerHTML=bookNames;
}
}
xhr.send();
}
</script>
</body>
</html>感悟:好久没写js了,头脑中关于java 语法与js 语法有点混乱了。js 中事件句柄都是小写,属性才是采用驼峰命名法!!!
结果:乱码
AJAX请求结果xml文件解析后结果:
绾㈡ゼ姊�瑗挎父璁�出现乱码,因为xml 文件设置了编码为GBK,即该xml 文件声明头为GBK,在eclipse中打开该xml 即出现了乱码。另外,xml 好像是采用其声明头来编码的,所以最好保持与页面的编码一致。
四、xml DOM 操作
获取XML DOM:
xmlDoc -由解析器创建的 XML 文档
getElementsByTagName("to")[0] - 第一个 <to> 元素。getElementsByTagName 可用于所有具有内部元素的元素。
childNodes[0] - <to> 元素的第一个子元素(或文本节点),之后才是其子元素。可用firstChild代替。
nodeValue - 节点的值(文本本身)
以books.xml 为例:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<name>红楼梦</name>
<author>曹雪芹</author>
</book>
</books>获取author 节点的内容"曹雪芹":
var book=xhr.responseXML.getElementsByTagName("book")[0];
var authorValue=book.childNodes[1].childNodes[0].nodeValue;
更清晰的写法:
var book=xhr.responseXML.getElementsByTagName("book")[0];
var author=book.getElementsByTagName("author")[0];
var authorValue=author.firstNode.nodeValue;
注:childNodes[0],当没有子元素时,指文本节点,有子元素时,指第一个子元素。
五、浏览器中的 XML 解析器
除了通过AJAX 的XMLHttpRequest 对象请求XML 得到解析后的xml 文档,还可通过 浏览器解析器请求XML 并自动解析,此方法不是统一的。
浏览器解析器:
function parseXML(){
//在IE 下可行
if(window.ActiveXObject){
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("xmls/books.xml");
var book2Name=xmlDoc.getElementsByTagName("book")[1].childNodes[1].childNodes[0].nodeValue;
alert(book2Name);
}
else{ alert("ActiveXObject不支持");}
}
function parseXML2(){
//不能用于IE 与谷歌李兰器,谷歌浏览器未实现load 方法,而IE 浏览器使用ActiveXObject
var xmlDoc=document.implementation.createDocument("","",null);
alert(xmlDoc);
xmlDoc.async="false";
xmlDoc.load("xmls/books.xml","text/xml");//提示未定义load 方法,什么原因?
var book2Name=xmlDoc.getElementsByTagName("book")[1].childNodes[1].childNodes[0].nodeValue;
alert(book2Name);
}
六、通过解析字符串解析得到xml 文档
if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");//txt 为字符串
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);
}
简单总结:
服务器上通过XML 存放数据用,客户端通过AJAX 请求使用;也可通过将XML 转换为字符串,发送给客户端后解析得到XML 文档。
dom4j 关键类:
DocumentHelper 工具类:创建Document 实例;
Document 类:代表xml 文档;
Element 类:元素类;
OutputFormat 类:控制输出xml 文件的格式;
XMLWriter 类:以Writer 类与Output 类实例作为参数,输出document 对象到文件、控制台或浏览器。

本文介绍了dom4j组件的基本使用方法,包括生成XML文件、读取和修改XML内容等。并通过实例展示了如何动态生成XML文件及在JSP中进行XML处理。
859

被折叠的 条评论
为什么被折叠?



