java-web 之 第二讲 -- dom4j 解析 XML 文件

dom4j 之 XML 解析

1:dom4j 简介

	   解析XML 文档的开放源代码XML 框架,支持 XML,XPath,XSLT, 出现前景是早期的 dom4j 分离出来后创建的,相对比 dom4j 灵活,也使用SAX 解析器来分析文档。
dom4j API 介绍
     继承关系图:
1XMl 文档的创建
DocumentHelper-- 静态方法
public class Test3 {
/**
*dom4j 创建 XML 文件
 */
public static void main(String[] args) {
// 创建根元素节点 然后创建文档对象
Element elRoot = DocumentHelper.createElement("student");
Document doc = DocumentHelper.createDocument(elRoot);
// 添加属性   先添加根节点的属性
elRoot.addAttribute("sn", "1");
//添加子元素和元素内容
Element elName = elRoot.addElement("name");
Element elAge = elRoot.addElement("age");
elName.setText("郭新杰");
elAge.setText("28");

//输出文档 到文件
try {
OutputFormat format = OutputFormat.createCompactFormat();
format.setEncoding("GB2312");
format.setIndent("    ");
//XMLWriter writer = new XMLWriter(new FileOutputStream("stu.xml"));输出到文件
XMLWriter writer = new XMLWriter(format);// 规范化输出
writer.write(doc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


xml 例子为:

<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
<students>
<student sn="1">
<name>张三</name>
<age>12</age>
</student>
<student sn="2">
<name>李四</name>
<age>13</age>
</student>
<student sn="3">
<name>王五</name>
<age>14</age>
</student>
<student sn="4">
<name>赵六</name>
<age>15</age>
</student>
</students>

构建 DOM 树 -- xml文件的 dom4j 解析
           dom4j 在 包中提供了两个类,DOMReader :从一个现有的 W3C DOM 树构建 dom4j 树  
				      SAXReader : 使用 SAX 解析器,从不同的输入源来构造 dom4j 树
		以SAXReader 为例来创建文档对象
			SAXReader sax = new SAXReader();
		接上面代码为:
		SAXReader sax = new SAXReader();
		File file = new File("test.xml");
		try {
			Document d = sax.read(file);
			// 访问根元素
			Element root = d.getRootElement();
			// 得到某个元素的所有子元素
			List list = root.elements();
			
			
			// 利用 XPath 表达式,需要引进 包 jaxen 的支持  
			list  = root.selectNodes("//name");  //获取 所有 <name> 的元素
			list  = root.selectNodes("//student[@sn='1']"); //获取 sn 的值=1的<student> 元素
			// XPath 表达式结束 --------------------------------------
			System.out.println("\n"+list.size());
			for(int m = 0;m<list.size();m++){
				Element name =(Element) list.get(m);
				System.out.println("这里是 sn 的值 -- "+name.attributeValue("sn"));// 这里是获取元素的指定属性  比如:sn
				//System.out.println("00 -- "+name.elementText("name"));// 获取name 的值  这里使用SAXReader 来获取
				System.out.println("00 -- "+name.getStringValue());// 获取name 的值 这里使用 XPath 表达式来获取
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// -------------------------------------------------以 DOMReader 来构造对象
		DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = df.newDocumentBuilder();
			File f = new File("test.xml");
			org.w3c.dom.Document doc1 = db.parse(f);
			
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	好了 基础回顾结束,下面开始讲解 dom4j 的访问者模式 和 基于事件的处理
 

2 : dom4j 访问者模式

	实际应用中,我们往往需要遍历整个XML 文档,根据不同类型的节点进行不同的操作,这个时候可以考虑下访问者模式(VIsitor),通常用于处理对象树结构,树中的每个节点对象都可以接受一个访问者对象,
	节点对象向访问者对象传递本身。访问者对象反过来调用节点对象的操作。
	dom4j 包中 有个 Visitor 接口,针对不同类型节点,定义了多个重载的 visit()  方法  如:访问元素方法为 void visit(Element node)  访问元素属性方法为:  void visit(Attribute node)
			我们需要实现 Visitor 接口  然后在 node 中定义了一个 accept(Visitor v)

      例子:
		public class Dom4jVisitor {


		/**
		 * dom4j 访问者模式
		 */
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			SAXReader read = new SAXReader();
			File f = new File("test.xml");
			try{
				Document doc = read.read(f);
				doc.accept(new MyVisitor());
			}catch(Exception e){
				e.printStackTrace();
			}
		}

	} 
	package com.tide.servlet;

import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;


public class MyVisitor extends VisitorSupport {


	/**
	 * 对于属性节点,打印出属性的名称和值
	 */
	public void visit(Attribute node){
		System.out.println("attribute: "+node.getName()+" == "+node.getValue());
	}
	
	/**
	 * 对于处理指令节点,打印出处理指令目标和数据
	 */
	public void visit(ProcessingInstruction node){
		System.out.println("处理指令 :"+node.getTarget()+" -- "+node.getText());
		
	/**
	 * 对于元素节点,判断是否只包含文本内容,如果是 打印出元素名称和内容
	 * 如果不是,只打印元素的名称
	 */
	public void visit(Element node){
		if(node.isTextOnly()){
			System.out.println("element: "+node.getName()+" == "+node.getText());
		}
	}
}
 
打印后的内容为:
处理指令 :xml-stylesheet -- type="text/xsl" href="student.xsl"
attribute: sn == 1
element: name == 张三
element: age == 12
attribute: sn == 2
element: name == 李四
element: age == 13
attribute: sn == 3
element: name == 王五
element: age == 14
attribute: sn == 4
element: name == 赵六
element: age == 15
 
 
 

3:dom4j 基于对事件的处理

		dom4j 支持对文档的基于事件的处理,尤其是对于较大的文档,可以利用 dom4j 提供的基于事件的处理模型,在解析过程中进行处理,而不必等到整个文档解析完毕。
	SAXReader 定义了 addHandler() 方法,用于添加一个 ElementHandler 实例
			public void addHandler(String path,ElementHandler handler)    当解析到参数 path 指定的路径时,将调用参数 handler 指定的处理器,针对不同的节点路径,可以添加多个ElementHandler实例。
	ElementHandler 接口的方法主要有:
		void onStart(ElementPath path) // 解析遇到元素的开始标签时被调用
		void onEnd(ElementPath path)   // 解析遇到元素的结束标签时被调用
	ElementPath 接口主要方法:
		void addHandler(String path,ElementHandler handler)  和 SAXReader 的 addHandler() 方法大致相同
		void removeHandler(String path)
		String getPath() //获取当前节点路径
		Element getCurrent() //获取当前元素
 
	例子:xml 文件还是上面的xml     最大的好处是不必要便利文档所有内容就可以对内容进行处理
		

public class Test4 {


	/**
	 * dom4j 基于事件的处理 ElementHandler
	 */
	public static void main(String[] args) {
		SAXReader read  = new SAXReader();
		File f = new File("test.xml");
		read.addHandler("/students/student", (ElementHandler) new StudentHandler());
		try{
			read.read(f);		
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
package com.tide.servlet;


import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;


/**
 * 定义 StudentHandler 处理器类, 对 <student> 元素进行处理
 * @author Administrator
 *
 */
public class StudentHandler implements ElementHandler{


	@Override
	public void onStart(ElementPath path) {
		Element ele =  path.getCurrent();
		System.out.println("Fount student : "+ele.attributeValue("sn"));
		//添加对子元素 name 的处理器
		path.addHandler("name", new Namehandler());
		System.out.println("添加对子元素 name 的处理器");
		
	}


	@Override
	public void onEnd(ElementPath path) {
		// 移除对子元素 name 的处理器
		path.removeHandler("name");
		System.out.println("移除对子元素 name 的处理器");
		
	}
	
}

package com.tide.servlet;


import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;


public class Namehandler implements ElementHandler {


	@Override
	public void onEnd(ElementPath path) {
		Element ele = path.getCurrent();
		//输出 <name> 元素的名称和文本内容
		System.out.println("name :"+ele.getName()+" == "+ele.getText());
	}


	@Override
	public void onStart(ElementPath path) {
		System.out.println("path : "+path.getPath());
		
	}


}
最后的输出内容为:
Fount student : 1
添加对子元素 name 的处理器
path : /students/student/name
name :name == 张三
移除对子元素 name 的处理器
Fount student : 2
添加对子元素 name 的处理器
path : /students/student/name
name :name == 李四
移除对子元素 name 的处理器
Fount student : 3
添加对子元素 name 的处理器
path : /students/student/name
name :name == 王五
移除对子元素 name 的处理器
Fount student : 4
添加对子元素 name 的处理器
path : /students/student/name
name :name == 赵六
移除对子元素 name 的处理器
 
	
 
 
 
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用dom4j解析xml文件可以通过以下步骤完成: 1. 加载xml文件,可以使用以下代码: ``` DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("file.xml")); ``` 2. 获取根节点,使用以下代码: ``` Element root = doc.getRootElement(); ``` 3. 遍历子节点,使用以下代码: ``` List<Element> childList = root.elements(); for (Element child : childList) { //对子节点进行操作 } ``` 4. 获取节点属性,使用以下代码: ``` String attributeValue = element.attributeValue("attributeName"); ``` 5. 获取节点值,使用以下代码: ``` String value = element.getText(); ``` ### 回答2: Java是一种流行的编程语言,在处理XML文件时,有很多的库可供选择。dom4j则是其中的一种库,它是一种同步、线程安全的XML解析器,拥有高效、灵活、简单的API。 dom4j解析XML文件分为以下步骤: 1. 创建SAXReader对象,它是dom4j解析器的核心类。 2. 调用SAXReader对象的read()方法,通过文件输入流读取XML文件内容并将其转换成一个Document对象。 3. 从Document对象中取到根元素(root element)。 4. 从根元素开始递归遍历所有子元素,获取特定元素的值或属性,修改元素的值或属性。 下面对以上步骤进行详细说明: 1. 创建SAXReader对象 SAXReader对象是dom4j解析器的核心对象,要解析XML文件,需要先创建该对象。创建SAXReader对象的代码如下: SAXReader reader = new SAXReader(); 2. 解析XML文件解析XML文件,需要调用SAXReader对象的read()方法,并传入要解析XML文件名或者文件输入流。代码示例如下: Document document = reader.read(new File("test.xml")); 3. 获取根元素 解析完成后,需要获取XML文件的根元素(即文档的最外层标签)。获取根元素的代码如下: Element root = document.getRootElement(); 4. 遍历所有子元素 获取根元素之后,可以通过遍历所有子元素来获取需要的元素、属性或者修改元素内容。遍历子元素的代码如下: List<Element> elements = root.elements(); for(Element element : elements) { // 对元素进行处理 } dom4j除了上述基本步骤外,还提供了更多的API和工具类,方便我们在XML文件处理过程中进行元素的增删改查、元素内容的验证和转换等操作。总的来说,dom4j是一种易用、灵活的XML解析器,广泛应用于Java开发领域。 ### 回答3: DOM4JJava语言中的一种XML文档操作工具包,它可以方便地对XML文档进行创建、读取、修改、查询及输出等操作。使用DOM4J解析XML文件可以方便地从XML文件中读取数据、进行数据处理,并将处理的数据保存到指定的文件或数据源中。 在使用DOM4J解析XML文件时,我们首先需要通过文档工厂类创建DOM4J的文档对象,然后就可以通过该文档对象获取XML文档的根节点,并对其进行遍历操作。 在遍历XML文档时,我们可以通过getElement()方法获取指定节点的子节点或属性节点,并通过getText()方法获取节点中的文本内容。同样地,我们也可以使用XPath表达式来获取指定节点的数据。 除了读取XML文件,我们还可以使用DOM4J创建和修改XML文件。在创建XML文件时,我们可以通过创建根节点和子节点来构建整个XML文档,并使用输出流将其保存到指定位置。在修改XML文件时,我们可以通过获取指定节点并修改其内容来对XML文档进行更新。 总的来说,DOM4J是一种强大的XML文档操作工具包,它不仅提供了丰富的API函数,还支持XPath表达式和XSLT样式表,使得我们可以方便地对XML文档进行操作和处理。通过学习DOM4J,我们可以更好地掌握Java语言中XML文档的读取、创建和修改等技术,从而更好地开发出高质量的Java应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值