XML_05_DOMJDOMDOM4J解析XML实例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML_05_DOMJDOMDOM4J解析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;
- /**
- *
- * @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
- <?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"
以上是关于XML_05_DOMJDOMDOM4J解析XML实例的主要内容,如果未能解决你的问题,请参考以下文章