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>
//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 对象到文件、控制台或浏览器。
- JSP —— XML 与dom4j 基础使用
- JAVA基础——使用DOM4J 解析xml
- XML解析之——使用dom4j解析XML
- xml学习笔记—简单使用DOM4J解析xml
- 使用Dom4j创建与解析XML文件
- [Java] XML 解析 与 Dom4j 的使用
- XML基础--解析(Dom4J)
- XML解析与创建之——DOM4J
- XML解析之—JDOM与DOM4J(更好)
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- java类——使用dom4j创建xml文件
- Java——使用DOM4j解析XML文档
- Java与XML(二):使用Dom4j 操作 XML 文件
- XML解析——Dom4j
- XML解析——Dom4j
- 垃圾收集简史
- matlab调试卷积深度置信网络CDBN-master的时候出现crbm_forward2D_batch_mex没法识别(解决)
- Java之fastjson学习
- 随机数学习整理
- git 创建项目和使用
- JSP —— XML 与dom4j 基础使用
- HDOJ 2023 求平均成绩
- 使用HttpURLConnection上传文件,进度条显示不正确
- 代码执行过程
- python爬虫常见问题
- Js复制剪切-兼容所有浏览器
- Android 6.0以上 需要运行时申请的权限(二)
- 敌兵布阵(线段树)hdu 1166
- NAND FLASH 驱动