JSP —— XML 与dom4j 基础使用

来源:互联网 发布:数据库查找重复数据 编辑:程序博客网 时间:2024/05/22 06:47

一、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 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  对象到文件、控制台或浏览器。



0 0
原创粉丝点击