JSP —— XML 与dom4j 基础使用

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

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



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值