Dom4J的基本使用

Dom4J的基本使用:

package com.wangbiao.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import com.wangbiao.vo.Address;
import com.wangbiao.vo.User;

public class Dom4j_Parse {

	// 常用方法
	//
	// 1.Element 元素API
	//
	// Method Comment
	//
	// getQName() 元素的QName 对象
	//
	// getNamespace() 元素所属的Namespace 对象
	//
	// getNamespacePrefix() 元素所属的Namespace 对象的prefix
	//
	// getNamespaceURI() 元素所属的Namespace 对象的URI
	//
	// getName() 元素的local name
	//
	// getQualifiedName() 元素的qualified name
	//
	// getText() 元素所含有的 text 内容,如果内容为空则返回一个空字符串而不是
	// null
	//
	// getTextTrim() 元素所含有的text 内容,其中连续的空格被转化为单个空格,该方法
	//
	// 不会返回null
	// attributeIterator() 元素属性的iterator,其中每个元素都是Attribute 对象
	//
	// attributeValue() 元素的某个指定属性所含的值
	//
	// elementIterator() 元素的子元素的iterator,其中每个元素都是Element 对象
	//
	// element() 元素的某个指定(qualified name 或者local name)的子元素
	//
	// elementText() 元素的某个指定(qualified name 或者local name)的子元素中
	//
	// 的text 信息
	// getParent 元素的父元素
	//
	// getPath() 元素的XPath 表达式,其中父元素的qualified name 和子元素的
	//
	// qualified name 之间使用"/"分隔
	// isTextOnly() 是否该元素只含有text 或是空元素
	//
	// isRootElement() 是否该元素是XML 树的根节点
	//
	// 2. Attribute 属性API
	//
	// Method Comment
	//
	// getQName() 属性的QName 对象
	//
	// getNamespace() 属性所属的Namespace 对象
	//
	// getNamespacePrefix() 属性所属的Namespace 对象的prefix
	//
	// getNamespaceURI() 属性所属的Namespace 对象的URI
	//
	// getName() 属性的local name
	//
	// getQualifiedName() 属性的qualified name
	//
	// getValue() 属性的值
	
	
	// 解析xml文件
	public static List<User> parseXml(File xmlFile) throws Exception {
		List<User> list = new ArrayList<User>();
		StringBuffer structure = new StringBuffer();

		// SAXReader解析
		SAXReader sax = new SAXReader();
		Document doc = sax.read(xmlFile);

		// DOMReader解析
		// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// DocumentBuilder db = dbf.newDocumentBuilder();
		// org.w3c.dom.Document domDocument = db.parse(xmlFile);
		// DOMReader reader = new DOMReader();
		// org.dom4j.Document document = reader.read(domDocument);

		// 获取根节点
		Element root = doc.getRootElement();
		structure.append(root.getName());
		structure.append("\n");
		// 获取所有的子节点
		Iterator<User> user_iterator = root.elementIterator();
		// 获取节点名为"User"的子节点
		// List e=(List) root.element("User");
		// 获取指定名称的第一个子节点
		// Element skill = root.element("User");
		// 获取节点属性
		// Attribute attr1 = skill.attribute("name");
		// 按照属性顺序获取属性
		// Attribute attr2 = skill.attribute(0);
		// 获取某节点下全部属性1
		// List<Attribute> list = skill.attributes();
		// 获取某节点下全部属性2
		// Element skill = root.element("skill");
		// for (Iterator<Attribute> it = skill.attributeIterator();
		// it.hasNext();) {
		// Attribute attr = it.next();
		// // TODO
		// }
		Map<String, String> userAttrMap = new HashMap<String, String>();
		Map<String, String> addressAttrMap = new HashMap<String, String>();

		while (user_iterator.hasNext()) {
			Element e = (Element) user_iterator.next();
			// 获取节点属性
			for (int i = 0; i < e.attributeCount(); i++) {
				System.out.println(e.attribute(i).getName() + "-"
						+ e.attribute(i).getValue());
			}
			structure.append("------");
			structure.append(e.getName());
			structure.append("\n");

			Iterator<User> child_iterator = e.elementIterator();
			while (child_iterator.hasNext()) {
				Element e_first = (Element) child_iterator.next();
				structure.append("--");
				structure.append(e_first.getName());
				structure.append("\n");
				userAttrMap.put(e_first.getName(), e_first.getText());

				if ("Address".equals(e_first.getName())) {
					Iterator<User> address_iterator = e_first.elementIterator();
					while (address_iterator.hasNext()) {
						Element e_second = (Element) address_iterator.next();
						structure.append("-----------------");
						structure.append(e_second.getName());
						structure.append("\n");
						addressAttrMap.put(e_second.getName(),
								e_second.getText());
					}
				}

			}
			// 开始封装数据
			User user = new User();
			user.setName(userAttrMap.get("name"));
			user.setAge(Integer.parseInt(userAttrMap.get("age")));
			user.setSex(userAttrMap.get("sex"));

			Address address = new Address();
			address.setProvice(addressAttrMap.get("provice"));
			address.setCity(addressAttrMap.get("city"));

			user.setAddress(address);
			list.add(user);

		}
		System.out.println(structure.toString());
		return list;
	}

	public static boolean generateXml() throws Exception {
		boolean flag = true;
		try {
			Document doc=DocumentHelper.createDocument();
			//设置Document type
			doc.addDocType("hibernate-configuration", 
			        "-//Hibernate/Hibernate Configuration DTD 3.0//EN", 
			        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
			
			
			Element root=doc.addElement("Information");
			Element stu=root.addElement("Student");
			stu.addAttribute("name", "zhangsan");
			Element stuClass=stu.addElement("class");
			stuClass.setText("0302");
			
			//第二种方法增加节点,内容,属性等。先创建节点,属性,然后使用add加入。 
			Element student=DocumentHelper.createElement("Student");
			root.add(student);
			Attribute attr=DocumentHelper.createAttribute(student,"test","good");
			student.add(attr);
			Element studentClass=DocumentHelper.createElement("class");
			studentClass.setText("0303");
			student.add(studentClass);
			
			
			//OutputFormat format=OutputFormat.createCompactFormat();xml文件内容紧凑在一起
			OutputFormat format=OutputFormat.createPrettyPrint();//推荐用这个,内容排版清晰
			format.setEncoding("UTF-8");
			FileOutputStream out=new FileOutputStream("D:"+File.separator+"student.xml");
			XMLWriter writer=new XMLWriter(out,format);
			writer.write(doc);
			writer.close();
		} catch (Exception e) {
			return flag=false;
		}
		return flag;
	}

	// 修改Xml文件
	public static void updateXml(File xmlFile) throws Exception {

		// DOMReader解析
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		org.w3c.dom.Document domDocument = db.parse(xmlFile);
		DOMReader reader = new DOMReader();
		org.dom4j.Document document = reader.read(domDocument);

		Element root = document.getRootElement();
		Element test = root.element("Test");
//		// 删除这个属性,但是并没有在Xml中删除,只是在内存中删除了。
		// test.remove(test.attribute("test"));
		List Attrs = test.attributes();
		for (Object object : Attrs) {
			if (object instanceof Attribute) {
				Attribute attr = (Attribute) object;
				System.out.println(attr.getName());
			} else {
				throw new Exception("ClassCast Exception!!!!!!!!!");
			}

		}
		// 删除指点节点
		Element address = test.element("Address");
		Element name = test.element("name");
		test.remove(address);
		test.remove(name);
		List list = test.elements();
		System.err.println(list.size());

		// 修改节点名称和节点值
		test.setName("User");
		test.setText("1234");

		Iterator tests = root.elementIterator();
		while (tests.hasNext()) {
			Element e = (Element) tests.next();
			System.out.println(e.getName() + "-" + e.getText());
		}

		// 修改属性值
		Attribute addre = test.attribute("test");
		addre.setText("new_flag");
		Iterator testss = test.elementIterator();
		while (testss.hasNext()) {
			Element e = (Element) testss.next();
			System.out.println(e.getName() + "-" + e.getText());
		}

		// 实例代码:把节点,属性,文档等转化成字符串,使用asXML()方法。
		String docXmlText = document.asXML();
		String rootXmlText = root.asXML();
		System.out.println(docXmlText);
		System.out.println(rootXmlText);

		// 实例代码:把字符串转换为文档,注意引号需要转义

		String skillString = "<skill name=\"xxx\">神龙摆尾</skill>";
		Document d = DocumentHelper.parseText(skillString);
		String dText = d.asXML();
		System.out.println(dText);
		
		
		
		//visitor
		//程序会从test节点开始,遍历全部子节点和子属性,注释,CDATA 等,即遍历Test节点内部的全 
		//部元素,由于我的MyVisitor 只覆写了Element 的处理方法,所以只处理所有的子节点
		test.accept(new MyVisitor());
	}
	
	
	public static void main(String[] args) throws Exception {
		List<User> result = new ArrayList<User>();
		File file = new File("D:" + File.separator + "test.xml");
		// result = parseXml(file);
		// if (result != null && result.size() > 0) {
		// for (User user : result) {
		// System.out.println("用户名:" + user.getName() + " 性别 :"
		// + user.getSex() + " 年龄:" + user.getAge() + " 家庭住址:"
		// + user.getAddress().getProvice() + "-"
		// + user.getAddress().getCity());
		// }
		// }
		updateXml(file);
		//generateXml();
	}

}

MyVisitor.java:

package com.wangbiao.test;

import org.dom4j.Attribute;
import org.dom4j.CDATA;
import org.dom4j.Comment;
import org.dom4j.Document;
import org.dom4j.DocumentType;
import org.dom4j.Element;
import org.dom4j.Entity;
import org.dom4j.Namespace;
import org.dom4j.ProcessingInstruction;
import org.dom4j.Text;
import org.dom4j.VisitorSupport;

public class MyVisitor extends VisitorSupport {

	@Override
	public void visit(Attribute node) {
		// TODO Auto-generated method stub
		super.visit(node);
	}

	@Override
	public void visit(CDATA node) {
		// TODO Auto-generated method stub
		super.visit(node);
	}

	@Override
	public void visit(Comment node) {
		// TODO Auto-generated method stub
		super.visit(node);
	}

	@Override
	public void visit(Document document) {
		// TODO Auto-generated method stub
		super.visit(document);
	}

	@Override
	public void visit(DocumentType documentType) {
		// TODO Auto-generated method stub
		super.visit(documentType);
	}

	@Override
	public void visit(Element node) {
		System.out.println(node.getName()+"----"+node.getText());
	}

	@Override
	public void visit(Entity node) {
		// TODO Auto-generated method stub
		super.visit(node);
	}

	@Override
	public void visit(Namespace namespace) {
		// TODO Auto-generated method stub
		super.visit(namespace);
	}

	@Override
	public void visit(ProcessingInstruction node) {
		// TODO Auto-generated method stub
		super.visit(node);
	}

	@Override
	public void visit(Text node) {
		// TODO Auto-generated method stub
		super.visit(node);
	}

	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}

	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
	}

}


你可能感兴趣的:(dom4j)