DOM、JDOM、DOM4J解析XML实例
一、DOM方式
原始name.xml
Html代码?- <?xml?version="1.0"?encoding="GB2312"?standalone="no"?><学生花名册>??
- ????<学生?性别="男">??
- ????????<姓名>李华</姓名>??
- ????????<年龄>14</年龄>??
- ????</学生>??
- ????<学生?性别="男">??
- ????????<姓名>张三</姓名>??
- ????????<年龄>16</年龄>??
- ????</学生>??
- ????<学生?性别="女">??
- ????????<姓名>王娟</姓名>??
- ????????<年龄>18</年龄>??
- ????</学生>??
- </学生花名册>??
数据模型Student.java
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文档示例程序
Java代码?- 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;??
- ??
- /**?
- ?*??
- ?*?@author?shijin?原始DOM解析XML方式?
- ?*??
- ?*/??
- 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);??
- ????}??
- ??
- ????/**?
- ?????*?show?根据vector中的student对象创建xml文档?
- ?????*??
- ?????*?@param?filename?
- ?????*????????????要创建的文档名?
- ?????*?@throws?ParserConfigurationException?
- ?????*?@throws?SAXException?
- ?????*?@throws?IOException?
- ?????*?@throws?TransformerException?
- ?????*/??
- ????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);??
- ????}??
- ??
- ????/**?
- ?????*?show?读取指定XML文档并将其对象化?
- ?????*??
- ?????*?@param?filename?
- ?????*?@return?存储Student对象的vector?
- ?????*?@throws?ParserConfigurationException?
- ?????*?@throws?SAXException?
- ?????*?@throws?IOException?
- ?????*/??
- ????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;??
- ????}??
- ??
- ????/**?
- ?????*?show?删除指定名为filename的xml文档中学生结点的性别属性为tagname的结点?
- ?????*??
- ?????*?@param?filename?
- ?????*?@param?tagname?
- ?????*?@throws?ParserConfigurationException?
- ?????*?@throws?SAXException?
- ?????*?@throws?IOException?
- ?????*?@throws?TransformerException?
- ?????*/??
- ????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
Java代码?- <?xml?version="1.0"?encoding="GB2312"?standalone="no"?>??
- <学生花名册>??
- <学生?性别="男">??
- <姓名>李华</姓名>??
- <年龄>14</年龄>??
- </学生>??
- <学生?性别="男">??
- <姓名>张三</姓名>??
- <年龄>16</年龄>??
- </学生>??
- </学生花名册>??
二、JDOM方式
HD.xml
Html代码?- <?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文档示例
Html代码?- 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
Html代码?- <?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示例
Java代码?- 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
Html代码?- <?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>