JAVA对xml进行解析和创建主要有四种方法:
DOM、SAX、DOM4J、JDOM
DOM、SAX :java 官方方式,不需要下载jar包
DOM4J、JDOM :第三方,需要网上下载jar包
一、DOM
1、概述
DOM解析xml,是一次性将xml文件中的所有内容全部导入到内存中,形成一颗倒树,再在内存中对其进行操作,对于内存的要求较高。
优点:形成了树结构,直观好理解,代码更容易编写。解析过程中,树结构保留在内存中,方便修改。
缺点:当xml文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出。
值得注意的是Dom4j还支持xPath,这让我们获取标签得到极大的方便。基本就需要记住两个方法,一句代码,便可以获取所有想获取到的元素
二、SAX
1、概述
这种解析方式原理是一边加载,一边处理,类似于事件的处理机制,适合xml文件较大的情况
三、JDOM
JDOM是第三方提供的解析XML方法,需要jdom-2.0.5.jar包
四、DOM4J
DOM4J 是第三方提供的解析XML方法,需要dom4j-1.6.1.jar包
Xml代码
1 <?xml version="1.0" encoding="GB2312"?> 2 <RESULT> 3 <VALUE> 4 <NO>A1234</NO> 5 <ADDR>河南省郑州市</ADDR> 6 </VALUE> 7 <VALUE> 8 <NO>B1234</NO> 9 <ADDR>河南省郑州市二七区</ADDR> 10 </VALUE> 11 </RESULT>
第一种 DOM 实现方法:
1 import java.io.File; 2 3 import javax.xml.parsers.DocumentBuilder; 4 import javax.xml.parsers.DocumentBuilderFactory; 5 6 import org.w3c.dom.Document; 7 import org.w3c.dom.NodeList; 8 9 public class MyXMLReader2DOM { 10 public static void main(String arge[]) { 11 12 long lasting = System.currentTimeMillis(); 13 14 try { 15 File f = new File("data_10k.xml"); 16 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 17 DocumentBuilder builder = factory.newDocumentBuilder(); 18 Document doc = builder.parse(f); 19 NodeList nl = doc.getElementsByTagName_r("VALUE"); 20 for (int i = 0; i < nl.getLength(); i++) { 21 System.out.print("车牌号码:"+ doc.getElementsByTagName_r("NO").item(i).getFirstChild().getNodeValue()); 22 System.out.println("车主地址:"+ doc.getElementsByTagName_r("ADDR").item(i).getFirstChild().getNodeValue()); 23 } 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } 27 } 28 }
第二种,DOM4J实现方法
1 import java.io.*; 2 import java.util.*; 3 import org.dom4j.*; 4 import org.dom4j.io.*; 5 6 public class MyXMLReader2DOM4J { 7 public static void main(String arge[]) { 8 long lasting = System.currentTimeMillis(); 9 try { 10 File f = new File("data_10k.xml"); 11 SAXReader reader = new SAXReader(); 12 Document doc = reader.read(f); 13 Element root = doc.getRootElement(); 14 Element foo; 15 for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) { 16 foo = (Element) i.next(); 17 System.out.print("车牌号码:" + foo.elementText("NO")); 18 System.out.println("车主地址:" + foo.elementText("ADDR")); 19 } 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 }
第三种 JDOM实现方法:
1 import java.io.*; 2 import java.util.*; 3 import org.jdom.*; 4 import org.jdom.input.*; 5 6 public class MyXMLReader2JDOM { 7 public static void main(String arge[]) { 8 long lasting = System.currentTimeMillis(); 9 try { 10 SAXBuilder builder = new SAXBuilder(); 11 Document doc = builder.build(new File("data_10k.xml")); 12 Element foo = doc.getRootElement(); 13 List allChildren = foo.getChildren(); 14 for (int i = 0; i < allChildren.size(); i++) { 15 System.out.print("车牌号码:"+ ((Element) allChildren.get(i)).getChild("NO").getText()); 16 System.out.println("车主地址:"+ ((Element) allChildren.get(i)).getChild("ADDR").getText()); 17 } 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 } 22 }
第四种SAX实现方法:
1 import javax.xml.parsers.SAXParser; 2 import javax.xml.parsers.SAXParserFactory; 3 4 import org.xml.sax.Attributes; 5 import org.xml.sax.InputSource; 6 import org.xml.sax.SAXException; 7 import org.xml.sax.helpers.DefaultHandler; 8 9 public class MyXMLReader2SAX extends DefaultHandler { 10 11 java.util.Stack tags = new java.util.Stack(); 12 13 public MyXMLReader2SAX() { 14 super(); 15 } 16 17 public static void main(String args[]) { 18 long lasting = System.currentTimeMillis(); 19 try { 20 SAXParserFactory sf = SAXParserFactory.newInstance(); 21 SAXParser sp = sf.newSAXParser(); 22 MyXMLReader2SAX reader = new MyXMLReader2SAX(); 23 sp.parse(new InputSource("data_10k.xml"), reader); 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } 27 28 System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) 29 + "毫秒"); 30 } 31 32 public void characters(char ch[], int start, int length) 33 throws SAXException { 34 String tag = (String) tags.peek(); 35 if (tag.equals("NO")) { 36 System.out.print("车牌号码:" + new String(ch, start, length)); 37 } 38 if (tag.equals("ADDR")) { 39 System.out.println("地址:" + new String(ch, start, length)); 40 } 41 } 42 43 public void startElement(String uri, String localName, String qName, 44 Attributes attrs) { 45 tags.push(qName); 46 } 47 }
XML四种解析方式性能测试:
SAX>DOM>DOM4J>JDOM
JUnit是Java提供的一种进行单元测试的自动化工具。测试方法可以写在任意类中的任意位置。使用JUnit可以没有main()入口进行测试。
DOM4J在灵活性和对复杂xml的支持上都要强于DOM
DOM4J的应用范围非常的广,例如在三大框架的Hibernate中是使用DOM4J的方式解析文件的。
DOM是w3c组织提供的一个官方解析方式,在一定程度上是有所应用的。
当XML文件比较大的时候,会发现DOM4J比较好用
1.JUnit:Java提供的单元测试;@Test注解;采用JUnit不需要程序入口main方法
2.性能测试结果:几kB的xml文件;建议使用DOM4J解析