dom4j生成/解析XML

声明:(此文章转载而来,当个人学习记录与积累,纯学习--小菜鸟)

1.生成xml文件

package com.xml.test;

import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
 * 使用Dom4j API构建一个Dom4j树,输出为一个XML文档
 * @author eastlift
 * 
 */
public class Dom4jDemo {

	public static void main(String[] args) {
		Document doc = DocumentHelper.createDocument();
		// public Document addProcessingInstruction(String target,
		// String text)
		// 添加预处理指令
		doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl href='student.xsl'");
		Element root = doc.addElement("students");

		Element elStu1 = root.addElement("student");
		Element elName1 = elStu1.addElement("name");
		Element elGender = elStu1.addElement("gender");
		Element elAge1 = elStu1.addElement("age");

		elName1.setText("张三");
		elGender.setText("男");
		elAge1.setText("20");

		Element elStu2 = root.addElement("student");
		Element elName2 = elStu2.addElement("name");
		Element elGender2 = elStu2.addElement("gender");
		Element elAge2 = elStu2.addElement("age");
		elName2.setText("王五");
		elGender2.setText("女");
		elAge2.setText("22");

		// OutputFormat(空位,是否换行,字符编码);
		OutputFormat outfm = new OutputFormat("    ", true, "utf-8");
		try {
			// 输出至文件
			XMLWriter xmlw = new XMLWriter(new FileWriter("f://dom4jDemo.xml"), outfm);
			xmlw.write(doc);
			xmlw.close();
		}
		catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

2.解析(第一种)

package com.xml.test;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;

/**
 * 利用访问者模式,遍历XML文档树
 */
public class Dom4jVisitorDemo {

	public static void main(String[] args) {
		SAXReader saxReder = new SAXReader();
		try {
			Document doc = saxReder.read("f:\\dom4jDemo.xml");
			doc.accept(new myVisitor());
		}
		catch (DocumentException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 访问者, 定义成了内部类,继承VisitorSupport,重写需要的方法 VisitorSupport 实现了 Visitor接口
	 * 
	 * @author eastlift
	 * 
	 */
	private static class myVisitor extends VisitorSupport {

		public void visit(Attribute note) {
			System.out.println("-=");
			System.out.println("属性:" + note.getName() + " =" + note.getValue());
		}

		public void visit(Element note) {
			// 判断这个元素是否是只有文本内容,
			// 如果有文本内容则将文本内容和元素名称打印出来,
			// 否则只将元素名称打印出来
			if (note.isTextOnly()) {
				System.out.println("元素名:" + note.getName() + "  文本  " + note.getText());
			}
			else {
				System.out.println("元素名:" + note.getName());
			}
		}

		// 处理指令
		public void visit(ProcessingInstruction pi) {
			System.out.println("处理指令:" + pi.getTarget() + " " + pi.getText());
		}
	}
}

3.解析(第二种)

package com.xml.test;

import java.io.File;

import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;

/**
 * Dom4j支持对文档的基于事件的处理。
 * 对于较大的XML文档,我们可以利用Dom4j的基于事件处理的模型,在解析的过程中进行处理,而不必等到整个文档解析完再处理。
 * 一个元素,对应一个ElementHandler
 * ElementHandler是一个接口,里面有两个方法,当元素的标签开始时调用onStart(),结束时调用onEnd() 此DEMO的XML文档如下:
 * 
 */
public class Dom4jElementHandler {

	public static void main(String[] args) {
		SAXReader saxReader = new SAXReader();
		// 两个参数,第一个用于指定元素的路径
		//
		saxReader.addHandler("/students/student", new studentHandler());
		try {
			saxReader.read(new File("F:\\dom4jDemo.xml"));
		}
		catch (DocumentException e) {
			e.printStackTrace();
		}
	}

	private static class studentHandler implements ElementHandler {
		public void onStart(ElementPath path) {
			Element elt = path.getCurrent();
			System.out.println(elt.attributeValue("sn"));
			// 两个参数,第一个用于指定元素的路径,可以用相对路径,也可以用相对路径
			path.addHandler("name", new nameHandler());
		}

		public void onEnd(ElementPath path) {
			path.removeHandler("name");
		}
	}

	private static class nameHandler implements ElementHandler {
		public void onStart(ElementPath path) {
			// 两个参数,第一个用于指定元素的路径,这里用了绝对路径,绝对路径是以 "/"开头的
			path.addHandler("/students/student/age", new ageHandler());
		}

		public void onEnd(ElementPath path) {
			Element elt = path.getCurrent();
			System.out.println(elt.getName() + "-----" + elt.getText());
			path.removeHandler("age");
		}
	}

	private static class ageHandler implements ElementHandler {
		public void onStart(ElementPath path) {
		}

		public void onEnd(ElementPath path) {
			Element elt = path.getCurrent();
			System.out.println(elt.getName() + "-----" + elt.getText());
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值