一、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>2、获取xml dom节点 //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 οnclick="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 对象到文件、控制台或浏览器。