1. 首先介绍XML的四种解析方式
①DOM (Document Object Model) 文档对象模型
②SAX (Simple API for XML)
③JDOM (Java-based Document Object Model)
④DOM4J (Document Object Model for java)
2.以下以代码为例进行说明
首先以下的所有解析xml文件以 person.xml 为例
1 <?xml version="1.0" encoding="UTF-8"?> 2 <person> 3 <teacher id="1"> 4 <name>苗创</name> 5 <desc>哈哈哈,我是是一个好人</desc> 6 </teacher> 7 8 <teacher id="2"> 9 <name>saoke</name> 10 <desc>她是我的室友</desc> 11 </teacher> 12 </person>
1.DOM
1 package com.baba.miao.xml; 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.DocumentBuilder; 9 import javax.xml.parsers.DocumentBuilderFactory; 10 import javax.xml.parsers.ParserConfigurationException; 11 12 import org.w3c.dom.Document; 13 import org.w3c.dom.Node; 14 import org.w3c.dom.NodeList; 15 import org.xml.sax.SAXException; 16 17 import com.baba.miao.vo.Teacher; 18 19 public class DomParseDemo { 20 21 public static void main(String[] args) throws ParserConfigurationException, 22 SAXException, IOException { 23 // 创建Dom工厂 24 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 25 // 通过解析工厂创建解析器 26 DocumentBuilder db = dbf.newDocumentBuilder(); 27 // 构造指定文件的输入流 28 InputStream is = Thread.currentThread().getContextClassLoader() 29 .getResourceAsStream("person.xml"); 30 // 开始解析,并返回Document 31 Document docu = db.parse(is); 32 33 List<Teacher> teachers = new ArrayList<Teacher>(); 34 Teacher t = null; 35 // 根据存档的节点获取 36 NodeList nodeList = docu.getElementsByTagName("teacher"); 37 for (int i = 0; i < nodeList.getLength(); i++) { 38 t = new Teacher(); 39 Node teachernode = nodeList.item(i); 40 // 获取当前节点的属性id值 41 String id = teachernode.getAttributes().getNamedItem("id") 42 .getNodeValue(); 43 System.out.println(id); 44 t.setId(Integer.parseInt(id)); 45 // 获取当前节点下的所有子节点列表 46 NodeList childNodeLise = teachernode.getChildNodes(); 47 for (int j = 0; j < childNodeLise.getLength(); j++) { 48 // 获取teacher节点下的其中子节点 49 Node childNode = childNodeLise.item(j); 50 String tagName = childNode.getNodeName(); 51 if ("name".equals(tagName)) { 52 // 获取teacher节点下的name节点的值 53 t.setName(childNode.getFirstChild().getNodeValue()); 54 } else if ("desc".equals(tagName)) { 55 // 获取teacher节点下的desc节点的值 56 t.setDesc(childNode.getFirstChild().getNodeValue()); 57 } 58 } 59 teachers.add(t); 60 } 61 // 输出 62 System.out.println(teachers); 63 } 64 }
2.SAX
四个接口:① ContentHandler接口 ②DTDHandler接口 ③EntityResolver接口 ④ErrorHandler接口
由于DefaultHandler类是sax默认基类,同时实现了上面的四个接口,因此继承该类即可。
SAX解析内容处理器
1 package com.baba.miao.xml; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.xml.sax.Attributes; 7 import org.xml.sax.SAXException; 8 import org.xml.sax.helpers.DefaultHandler; 9 10 import com.baba.miao.vo.Teacher; 11 12 /** 13 * SAX解析内容处理器 14 * 15 * @author Administrator 16 * 17 */ 18 public class PersonHandler extends DefaultHandler { 19 20 private List<Teacher> teachers = null; 21 22 public List<Teacher> getTeachers() { 23 return teachers; 24 } 25 26 private Teacher teacher; 27 private String tag; 28 29 // XML文档开始解析时,调用的方法 30 @Override 31 public void startDocument() throws SAXException { 32 teachers = new ArrayList<Teacher>(); 33 } 34 35 // 解析开始元素是调用该方法 36 // uri : 标签的命名空间 37 // localName :元素的本地名称(不带前缀) 38 // qName : 带前缀的元素名称 39 // attributes:属性的集合 40 @Override 41 public void startElement(String uri, String localName, String qName, 42 Attributes attributes) throws SAXException { 43 if ("teacher".equals(qName)) { 44 teacher = new Teacher(); 45 // 取出属性,并添加teacher中 46 teacher.setId(Integer.parseInt(attributes.getValue("id"))); 47 } 48 tag = qName; 49 } 50 51 // 解析结束元素时调用的方法 52 @Override 53 public void endElement(String uri, String localName, String qName) 54 throws SAXException { 55 if ("teacher".equals(qName)) { 56 teachers.add(teacher); 57 } 58 tag = null; 59 } 60 61 // 解析文本内容时调用的方法 62 @Override 63 public void characters(char[] ch, int start, int length) 64 throws SAXException { 65 if (tag != null) { 66 if ("name".equals(tag)) { 67 teacher.setName(new String(ch, start, length)); 68 } else if ("desc".equals(tag)) { 69 teacher.setDesc(new String(ch, start, length)); 70 } 71 } 72 } 73 74 // XML解析完成 75 @Override 76 public void endDocument() throws SAXException { 77 super.endDocument(); 78 System.out.println("XML解析完毕"); 79 } 80 }
解析xml
1 package com.baba.miao.xml; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.List; 6 7 import javax.xml.parsers.ParserConfigurationException; 8 import javax.xml.parsers.SAXParser; 9 import javax.xml.parsers.SAXParserFactory; 10 11 import org.xml.sax.SAXException; 12 13 import com.baba.miao.vo.Teacher; 14 15 public class SaxParseDemo { 16 17 public static void main(String[] args) throws ParserConfigurationException, 18 SAXException, IOException { 19 // 创建Sax解析器工厂对象 20 SAXParserFactory factory = SAXParserFactory.newInstance(); 21 // 根据工厂创建解析器对象 22 SAXParser sax = factory.newSAXParser(); 23 InputStream is = Thread.currentThread().getContextClassLoader() 24 .getResourceAsStream("person.xml"); 25 PersonHandler ph = new PersonHandler(); 26 // 开始解析 27 sax.parse(is, ph); 28 List<Teacher> list = ph.getTeachers(); 29 System.out.println(list); 30 } 31 }
3.JDOM
该文档对象,必须引入第三方组件 ---> jdom-2.0.5.jar
下载地址:http://www.jdom.org/downloads/index.html
下载如图:
1 package com.baba.miao.xml; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import org.jdom2.Document; 9 import org.jdom2.Element; 10 import org.jdom2.JDOMException; 11 12 13 import org.jdom2.input.SAXBuilder; 14 15 import com.baba.miao.vo.Teacher; 16 17 /** 18 * 使用第三方组件 19 * 20 * @author Administrator 21 * 22 */ 23 public class JdomParseDemo { 24 25 public static void main(String[] args) throws JDOMException, IOException { 26 //创建解析器 27 SAXBuilder saxBuilder = new SAXBuilder(); 28 InputStream is = Thread.currentThread(). 29 getContextClassLoader().getResourceAsStream("person.xml"); 30 //开始解析 31 Document docu = saxBuilder.build(is); 32 33 //获取根元素 34 Element root = docu.getRootElement(); 35 //获取根元素下的所有的子元素 36 37 List<Element> list = root.getChildren(); 38 39 List<Teacher> teachers = new ArrayList<Teacher>(); 40 //遍历 41 for(int i = 0;i < list.size();i++){ 42 Teacher t = new Teacher(); 43 Element e = list.get(i); 44 String id = e.getAttributeValue("id"); 45 t.setId(Integer.parseInt(id)); 46 //获取当前元素的子元素的文本内容 47 t.setName(e.getChildText("name")); 48 t.setDesc(e.getChildText("desc")); 49 teachers.add(t); 50 } 51 System.out.println(teachers); 52 } 53 }
4.DOM4J
必须引入第三方组件 ---> dom4j-1.6.1.jar
下载网站 : http://www.dom4j.org/dom4j-1.6.1/
1 package com.baba.miao.xml; 2 3 import java.io.InputStream; 4 import java.util.ArrayList; 5 import java.util.Iterator; 6 import java.util.List; 7 8 import org.dom4j.Document; 9 import org.dom4j.DocumentException; 10 import org.dom4j.Element; 11 import org.dom4j.io.SAXReader; 12 13 import com.baba.miao.vo.Teacher; 14 15 public class Dom4jParseDemo { 16 17 public static void main(String[] args) throws DocumentException { 18 // 创建解析器 19 SAXReader saxReader = new SAXReader(); 20 21 InputStream is = Thread.currentThread().getContextClassLoader() 22 .getResourceAsStream("person.xml"); 23 // 开始解析,并返回Document 24 Document docu = saxReader.read(is); 25 Element root = docu.getRootElement(); 26 // 获取根元素的所有子元素 27 Iterator<Element> iters = root.elementIterator(); 28 List<Teacher> list = new ArrayList<Teacher>(); 29 while (iters.hasNext()) { 30 Teacher t = new Teacher(); 31 Element e = iters.next(); 32 t.setId(Integer.parseInt(e.attributeValue("id"))); 33 t.setName(e.elementText("name")); 34 t.setDesc(e.elementText("desc")); 35 list.add(t); 36 } 37 System.out.println(list); 38 } 39 40 }
比较:
1.JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出
2.SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,
但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中).
|--> 如果是做手机方面的可以考虑,因为手机很难扩容
3.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,
例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
|--> 如果是考虑服务器方面的可以考虑,服务器很容易扩容
本人是一个JAVA爱好者,欢迎交流
------By 小苗