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(); } }