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 }
xml文档解析
时间: 2024-10-29 19:10:08