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 }

xml文档解析

时间: 2024-10-29 19:10:08

xml文档解析的相关文章

安卓xml文档解析

2014-12-27   14:53:32 解析xml文档 用xml文档存储数据 1.获得文件的路径 1 File path = new File(Environment.getExternalStorageDirectory(), "persons.xml"); 2.建立文件输出流 1 FileInputStream fis = new FileInputStream(path); 3.获得xml文档解析器对象 1 XmlPullParser parser=Xml.newPullPa

jsoup -- xml文档解析

jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookbook/modifying-data/set-html https://jsoup.org/cookbook/modifying-data/set-text 时间 2014-06-20 07:01:12  ITeye-博客 原文  http://zsjdxc251.iteye.com/blog/20

浅析如何将XML文档解析成java对象(待梳理)

User类 public class User implements Serializable { private static final long serialVersionUID = 7506854293380407436L; private Integer id; private String loginName; private String password; private Date createDate; private String username; public User(

关于XML文档解析(DOM和SAX)

DOM解析方式是将整个XML文档以document形式构架在内存中,当XML文档很大时,可能会造成OOM(内存溢出).而SAX则是一行行的去解析的,速度很快. DOM解析: 1,通过DocumentBuilderFactory创建DOM解析工厂; 2,由工厂获取DocumentBuilder解析器对象; 3,通过解析器将XML转换成Document对象 注:在对XML文档进行修改后,需要利用TransFormerFactory对其进行更新. SAX解析: 1,通过SAXParserFactory

Java学习总结(21)——XML文档解析:DOM解析,SAX解析

一.XML简介1.可扩展性标记语言(eXtensible Markup Language)2.XML用于描述数据3.应用场合:(1)持久化存储数据(2)数据交换(3)数据配置4.XML语法(1)文档类型:在编写XML文档时,需要先使用文档声明,声明XML文档的类型.最简单的声明语法:<?Xml version="1.0" ?>用encoding属性说明文档的字符编码:<?Xml version="1.0" encoding="GB2312

用dom4j对xml文档解析

package com.huowolf.dom4j; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Doc

MVC模式简单的Xml文档解析加Vue渲染

前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/Js/vue.js"></script></head><body> <div> <div id="vue_det"> <ul v-for="mess in message"> <

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用

Android解析XML文档的两种方式的简单对比

Android之所以会用到解析XML文档,不仅与JAVA对XML的解析比较简单,而且还因为XML是Android在网络间传递信息的主要存储方式.下面我简单谈谈Android对XML文档解析的两种方式:dom和sax.dom解析方式是,解析方法将一个XML文件看成是一棵树.由数据结构的知识我们知道对树的处理比较简单,就是对树的节点进行增,删,改,查,这也是dom的一个最大优点.但是,dom方式在解析的时候是一次性就将整个XML文档读进内存,这坏处不用我说了吧,我宝贵的内存是禁不起这么折腾的. sa