首页 > 代码库 > xml文档解析

xml文档解析

XML文档解主要分为四种解析方式,官方提供的两种分别是:DOM 和 SAX,第三方分别是:JDOM 和 DOM4j

 

测试用的xml文档:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <user>
 3     <uname type="3">zhangsan</uname>
 4     <uname type="2">王麻子</uname>
 5     <uname>lisi</uname>
 6     <pwd>
 7         123456
 8         <abcd>
 9             aaaaaaa
10             <uname type="3">zhaoliu</uname>
11         </abcd>
12         <uname>wangwu</uname>
13     </pwd>
14 </user>

 

使用DOM解析如下:

 1 package com.xmldemo;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 import javax.xml.parsers.DocumentBuilder;
 7 import javax.xml.parsers.DocumentBuilderFactory;
 8 import javax.xml.parsers.ParserConfigurationException;
 9 
10 import org.w3c.dom.Document;
11 import org.w3c.dom.Element;
12 import org.w3c.dom.NodeList;
13 import org.xml.sax.SAXException;
14 
15 public class DomTest {
16 
17     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
18         //创建解析的工厂类
19         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
20         //创建解析
21         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
22         //获取user.xml的文件流 并且需要保证 xml放在src的根目录
23         InputStream is = DomTest.class.getClassLoader().getResourceAsStream("user.xml");
24         //创建文档对象模型
25         Document document = documentBuilder.parse(is);
26         //获取指定节点的集合
27         NodeList nodeList = document.getElementsByTagName("uname");
28         //遍历并获取
29         for (int i = 0; i < nodeList.getLength(); i++) {
30             Element element = (Element) nodeList.item(i);
31             System.out.println(element.getTagName() + "----->" + element.getAttribute("type") + "---->" + element.getTextContent());
32         }
33 
34     }
35 }

 以下是SAX方式解析:

 1 package com.xmldemo;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import javax.xml.parsers.ParserConfigurationException;
 9 import javax.xml.parsers.SAXParser;
10 import javax.xml.parsers.SAXParserFactory;
11 
12 import org.xml.sax.Attributes;
13 import org.xml.sax.SAXException;
14 import org.xml.sax.helpers.DefaultHandler;
15 
16 public class SaxTest {
17     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
18         //创建解析器的工厂类
19         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
20         //创建解析器
21         SAXParser saxParser = saxParserFactory.newSAXParser();
22         //获取xml文件流
23         InputStream is = SaxTest.class.getClassLoader().getResourceAsStream("user.xml");
24         //创建自己的处理类
25         MyHandle myHandle = new MyHandle();
26         //直接进行解析
27         saxParser.parse(is, myHandle);
28 
29         for (int i = 0; i < myHandle.list.size(); i++) {
30             System.out.println("SaxTest.main()" + myHandle.list.get(i));
31         }
32     }
33 }
34 
35 /**
36  * 对XMl处理的方法
37  * @author Bjsxt2013
38  *
39  */
40 class MyHandle extends DefaultHandler {
41 
42     public List<String> list = new ArrayList<String>();
43 
44     private String elementName = null;
45 
46     @Override
47     public void characters(char[] ch, int start, int length) throws SAXException {
48         //System.out.println("MyHandle.characters()" + new String(ch, start, length));
49         if (elementName != null && "uname".equals(elementName)) {
50             //System.out.println(new String(ch, start, length));
51             list.add(new String(ch, start, length));
52         }
53     }
54 
55     @Override
56     public void endElement(String uri, String localName, String qName) throws SAXException {
57         //System.out.println("MyHandle.endElement()" + qName);
58         elementName = null;
59     }
60 
61     @Override
62     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
63         //System.out.println("MyHandle.startElement()" + qName);
64         elementName = qName;
65     }
66 
67     @Override
68     public void startDocument() throws SAXException {
69         //System.out.println("MyHandle.startDocument()");
70     }
71 
72     @Override
73     public void endDocument() throws SAXException {
74         //System.out.println("MyHandle.endDocument()");
75     }
76 }

 

 

以下是JDom方式解析:

  1 package com.xmldemo;
  2 
  3 import java.io.FileNotFoundException;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.util.List;
  8 
  9 import org.jdom.Attribute;
 10 import org.jdom.Document;
 11 import org.jdom.Element;
 12 import org.jdom.JDOMException;
 13 import org.jdom.input.SAXBuilder;
 14 import org.jdom.output.Format;
 15 import org.jdom.output.XMLOutputter;
 16 
 17 /**
 18  * 1.如何动态生成xml文件
 19  * 2.如何解析xml文件
 20  * 3.如何修改xml文件
 21  * 
 22  * 如何快速的解析xml文件
 23  * @author Bjsxt2013
 24  *
 25  */
 26 public class JdomTest {
 27 
 28     public static void main(String[] args) throws Exception {
 29         String filePath = System.getProperty("user.dir") + "\\src\\create.xml";
 30         //System.out.println(filePath);
 31         //createXml(filePath);
 32         parserXml(filePath);
 33     }
 34 
 35     /**
 36      * 解析并修改XMl文件
 37      * @param filePath
 38      * @throws JDOMException
 39      * @throws IOException
 40      */
 41     public static void parserXml(String filePath) throws JDOMException, IOException {
 42         //创建JDom的解析器
 43         SAXBuilder saxBuilder = new SAXBuilder();
 44         //获取XML对象的流
 45         InputStream is = JdomTest.class.getClassLoader().getResourceAsStream("create.xml");
 46         //解析并生成document对象
 47         Document document = saxBuilder.build(is);
 48         //获取根节点
 49         Element rootElement = document.getRootElement();
 50         //修改根节点的属性
 51         rootElement.setAttribute("sno", "9999");
 52         rootElement.setAttribute("type01", "aaaaaaaaaaaaaa");
 53         Attribute type = new Attribute("type", "abcdefg");
 54         rootElement.setAttribute(type);
 55 
 56         //获取指定的子节点
 57         Element stuName = rootElement.getChild("stuName");
 58         Element abcd = stuName.getChild("abcd");
 59         //获取节点对应的值
 60         //System.out.println("JdomTest.parserXml()" + abcd.getText());
 61         abcd.setText("唐僧");
 62         //The attribute already has an existing parent "student"
 63         //abcd.setAttribute(type);
 64 
 65         //获取所有的子节点
 66         List<Element> list = rootElement.getChildren();
 67         for (int i = 0; i < list.size(); i++) {
 68             System.out.println("JdomTest.parserXml()" + list.get(i).getName());
 69         }
 70         //创建新的节点
 71         Element score = new Element("score");
 72         score.setText("99");
 73         rootElement.addContent(score);
 74         //再所有的节点之后设置文本内容  不能直接调用setText方法
 75         //rootElement.setText("abcdefghijklmn");
 76         rootElement.addContent("abcdefghij");
 77         //设置写出的格式
 78         Format format = Format.getPrettyFormat();//格式良好的
 79         //Format format = Format.getCompactFormat();//格式紧凑的
 80         format.setEncoding("utf-8");
 81         //将文档对象模型写出到硬盘
 82         XMLOutputter xmlOutputter = new XMLOutputter(format);
 83         xmlOutputter.output(document, new FileOutputStream(filePath));
 84     }
 85 
 86     /**
 87      * 创建一个XML文件
 88      * @param filePath
 89      * @throws FileNotFoundException
 90      * @throws IOException
 91      */
 92     public static void createXml(String filePath) throws FileNotFoundException, IOException {
 93         //创建学生节点(根节点)
 94         Element rootElement = new Element("student");
 95         //添加属性
 96         rootElement.setAttribute("sno", "201209888");
 97         //创建姓名节点
 98         Element stuName = new Element("stuName");
 99         //给姓名节点设置值
100         stuName.setText("柳岩");
101         //创建年龄节点
102         Element age = new Element("age");
103         age.setText("18");
104         //将节点连起来
105         rootElement.addContent(stuName);
106         rootElement.addContent(age);
107 
108         //创建文档对象模型
109         Document document = new Document(rootElement);
110         //设置写出的格式
111         Format format = Format.getPrettyFormat();//格式良好的
112         //Format format = Format.getCompactFormat();//格式紧凑的
113         format.setEncoding("utf-8");
114         //将文档对象模型写出到硬盘
115         XMLOutputter xmlOutputter = new XMLOutputter(format);
116         xmlOutputter.output(document, new FileOutputStream(filePath));
117     }
118 }