天天看点

DOM、JDOM、DOM4J解析XML实例

一、DOM方式

原始name.xml

<?xml version="1.0" encoding="GB2312" standalone="no"?><学生花名册> <学生 性别="男"> <姓名>李华</姓名> <年龄>14</年龄> </学生> <学生 性别="男"> <姓名>张三</姓名> <年龄>16</年龄> </学生> <学生 性别="女"> <姓名>王娟</姓名> <年龄>18</年龄> </学生> </学生花名册>

数据模型Student.java

package com.upcgrid.dom; public class Student { private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

DOM方式解析xml文档示例程序

package com.upcgrid.dom; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException; public class DOMTest { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException { DOMTest test = new DOMTest(); test.deleteElement("name.xml", "女"); Vector<Student> stus = test.changeXMLToModel("name.xml"); for (Student stu : stus) { System.out.print(stu.getName() + " " + stu.getSex() + " " + stu.getAge() + "\n"); } // 输出: // 李华 男 14 // 张三 男 16 test.createDocument("name2.xml", stus); } public void createDocument(String filename, Vector<Student> stus) throws ParserConfigurationException, SAXException, IOException, TransformerException { // 得到DOM解析器的工厂实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 从DOM工厂获取DOM解析器 DocumentBuilder builder = dbf.newDocumentBuilder(); // 创建document对象 Document doc = builder.newDocument(); Element root = doc.createElement("学生花名册");// 创建根元素 doc.appendChild(root);// 添加根元素 for (Student stu : stus) { Element stuElement = doc.createElement("学生"); stuElement.setAttribute("性别", stu.getSex()); Element nameElement = doc.createElement("姓名"); Text nameText = doc.createTextNode(stu.getName()); nameElement.appendChild(nameText); Element ageElement = doc.createElement("年龄"); Text ageText = doc.createTextNode(String.valueOf(stu.getAge())); ageElement.appendChild(ageText); stuElement.appendChild(nameElement); stuElement.appendChild(ageElement); root.appendChild(stuElement); } FileOutputStream fos = new FileOutputStream(filename); OutputStreamWriter ow = new OutputStreamWriter(fos); // 保存xml文件 DOMSource doms = new DOMSource(doc); // 创建结果输出流 StreamResult result = new StreamResult(ow); // 得到转换工厂实例 TransformerFactory transFac = TransformerFactory.newInstance(); // 得到转换器实例 Transformer trans = transFac.newTransformer(); // 转化器设置输出文档的编码方式 trans.setOutputProperty(OutputKeys.ENCODING, "GB2312"); //设置支持缩进 trans.setOutputProperty(OutputKeys.INDENT, "yes"); // 将文档源转换到结果输出流 trans.transform(doms, result); } public Vector<Student> changeXMLToModel(String filename) throws ParserConfigurationException, SAXException, IOException { // 得到DOM解析器的工厂实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 从DOM工厂获取DOM解析器 DocumentBuilder builder = dbf.newDocumentBuilder(); // 解析xml文档,获得document对象,即DOM树 Document doc = builder.parse(filename); // 获取根节点 Element root = doc.getDocumentElement(); // 获取根节点的子节点中名字为"学生"的节点列表 NodeList stuNodes = root.getElementsByTagName("学生"); Vector<Student> students = new Vector<Student>(); // 遍历<学生>节点 for (int i = 0; i < stuNodes.getLength(); i++) { // 获取一个学生节点 Element stuNode = (Element) stuNodes.item(i); // 创建一个学生对象 Student stu = new Student(); stu.setSex(stuNode.getAttribute("性别")); // 获取<学生>节点的子节点中名字为"姓名"的节点列表 NodeList nameNodes = stuNode.getElementsByTagName("姓名"); // 取得第一个姓名 Element nameNode = (Element) nameNodes.item(0); stu.setName(nameNode.getTextContent()); // 获取<学生>节点的子节点中名字为"年龄"的节点列表 NodeList ageNodes = stuNode.getElementsByTagName("年龄"); // 取得第一个年龄 Element ageNode = (Element) ageNodes.item(0); stu.setAge(Integer.parseInt(ageNode.getTextContent())); students.add(stu); } return students; } public void deleteElement(String filename, String tagname) throws ParserConfigurationException, SAXException, IOException, TransformerException { // 得到DOM解析器的工厂实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 从DOM工厂获取DOM解析器 DocumentBuilder builder = dbf.newDocumentBuilder(); // 解析xml文档,获得document对象,即DOM树 Document doc = builder.parse(filename); // 找到删除节点 NodeList stuNodes = doc.getElementsByTagName("学生"); for (int i = 0; i < stuNodes.getLength(); i++) { Element stuElement = (Element) stuNodes.item(i); String sex = stuElement.getAttribute("性别"); if (sex.equals(tagname)) { stuElement.getParentNode().removeChild(stuElement); } } // 保存xml文件 DOMSource doms = new DOMSource(doc); // 创建结果输出流 StreamResult result = new StreamResult(new FileOutputStream(filename)); // 得到转换工厂实例 TransformerFactory transFac = TransformerFactory.newInstance(); // 得到转换器实例 Transformer trans = transFac.newTransformer(); // 转化器设置输出文档的编码方式 trans.setOutputProperty(OutputKeys.ENCODING, "GB2312"); // 将文档源转换到结果输出流 trans.transform(doms, result); } }

输出:

李华 男 14

张三 男 16

结果name.xml

<?xml version="1.0" encoding="GB2312" standalone="no"?><学生花名册> <学生 性别="男"> <姓名>李华</姓名> <年龄>14</年龄> </学生> <学生 性别="男"> <姓名>张三</姓名> <年龄>16</年龄> </学生> </学生花名册>

name2.xml

<?xml version="1.0" encoding="GB2312" standalone="no"?> <学生花名册> <学生 性别="男"> <姓名>李华</姓名> <年龄>14</年龄> </学生> <学生 性别="男"> <姓名>张三</姓名> <年龄>16</年龄> </学生> </学生花名册>

二、JDOM方式

HD.xml

<?xml version="1.0" encoding="UTF-8"?> <HD> <disk name="C"> <capacity>8G</capacity> <directories>200</directories> <files>1580</files> </disk> <disk name="D"> <capacity>10G</capacity> <directories>500</directories> <files>3000</files> </disk> </HD>

JDOM解析XML文档示例

package com.upcgrid.jdom; import java.io.IOException; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class JDOMTest { public static void main(String[] args) throws JDOMException, IOException { // 获得JDOM以SAX方式处理XML文档的构造器 SAXBuilder saxb = new SAXBuilder(); // 通过SAX构造器获得XML文档对象 Document doc = saxb.build(JDOMTest.class.getClassLoader() .getResourceAsStream("test.xml")); // 获取根元素HD Element root = doc.getRootElement(); // 取名字为disk的所有元素 List<Element> list = root.getChildren("disk"); for (int i = 0; i < list.size(); i++) { //取得第i个disk节点 Element diskElement = (Element) list.get(i); //取得disk属性name String name = diskElement.getAttributeValue("name"); // 取disk子元素capacity的内容 String capacity = diskElement.getChildText("capacity"); String directories = diskElement.getChildText("directories"); String files = diskElement.getChildText("files"); System.out.println("磁盘信息:"); System.out.println("分区盘符:" + name); System.out.println("分区容量:" + capacity); System.out.println("目录数:" + directories); System.out.println("文件数:" + files); System.out.println("-----------------------------------"); } } }

输出结果:

磁盘信息:

分区盘符:C

分区容量:8G

目录数:200

文件数:1580

-----------------------------------

磁盘信息:

分区盘符:D

分区容量:10G

目录数:500

文件数:3000

-----------------------------------

三、DOM4J方式

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping> <class name="com.upcgrid.User" table="t_user"> <property name="username">aaa</property> <property name="password">bbb</property> </class>> </hibernate-mapping>

DOM4J解析XML示例

package com.upcgrid.dom4j; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class DOM4JTest { public static void main(String[] args) { //获得DOM4J以SAX方式处理XML文档的管道 SAXReader reader = new SAXReader(); try { //通过管道获得XML文档对象 Document document = reader.read(new File("User.hbm.xml")); //获取根节点 Element root = document.getRootElement(); System.out.println(root.getName()); Element element = null; //遍历根节点下的节点 for(Iterator<Element> i = root.elementIterator();i.hasNext();){ //根节点的子节点 element = (Element) i.next(); System.out.println(element.getName()); //遍历节点属性 for(Iterator<Attribute> j = element.attributeIterator();j.hasNext();){ Attribute attr = (Attribute)j.next(); System.out.println(attr.getName()+":"+attr.getValue()); } //遍历名为"property"的节点 for(Iterator<Element> k = element.elementIterator("property");k.hasNext();){ Element e1 = (Element)k.next(); System.out.println(e1.getData()); } } //通过Xpath的方式寻找节点 List<Node> list = document.selectNodes("//hibernate-mapping/class/property"); for(Node n: list){ String name = n.valueOf("@name"); System.out.println(n.getName()+" @name:"+name); } //只拿第一个 Node node = document.selectSingleNode("//hibernate-mapping/class"); String name = node.valueOf("@name"); String table = node.valueOf("@table"); System.out.println(node.getName()+" @name:"+name+",@table:"+table); createDocument(); } catch (DocumentException e) { e.printStackTrace(); } } public static Document createDocument(){ //创建document对象 Document document = DocumentHelper.createDocument(); Element root = document.addElement("hibernate-mapping"); //链式编程 Element classElement = root.addElement("class") .addAttribute("name", "com.upcgrid.User") .addAttribute("table", "t_user"); classElement.addElement("property").addAttribute("name", "username").addText("aaa"); classElement.addElement("Property").addAttribute("name", "password").addText("bbb");; try { FileWriter out = new FileWriter("User1.hbm.xml"); document.write(out); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } try { //设定美化格式 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new FileWriter("User2.hbm.xml"),format); writer.write(document); writer.close(); //缩减格式 } catch (IOException e) { e.printStackTrace(); } return document; } }

输出:

hibernate-mapping

class

name:com.upcgrid.User

table:t_user

aaa

bbb

property @name:username

property @name:password

class @name:com.upcgrid.User,@table:t_user

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping><class name="com.upcgrid.User" table="t_user"><property name="username">aaa</property><Property name="password">bbb</Property></class></hibernate-mapping>

User2.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping> <class name="com.upcgrid.User" table="t_user"> <property name="username">aaa</property> <Property name="password">bbb</Property> </class> </hibernate-mapping>