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 实现方法:
为XML文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。
优点:整个文档树在内存中,便于操作,支持删除、修改、重新排列等多种功能。
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间。
使用场合:一旦解析了文档还需多次访问这些数据,硬件资源充足(内存、CPU)。
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实现方法
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 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实现方法:
为减少DOM、SAX的编码量,出现了JDOM
优点:20-80原则,极大减少了代码量。
使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
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实现方法:
为解决DOM的问题,出现了SAX,SAX 事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时发送事件,程序员编写响应这些事件的代码,保存数据。
优点:不用事先调入整个文档,占用资源少。SAX解析器代码比DOM解析器代码小,适于Applet下载。
缺点:不是持久的,事件过后若没保存数据,那么数据就丢了。无状态性,从事件中只能得到文本,但不知该文本属于哪个元素。
使用场合:Applet。只需XML文档的少量内容,很少回头访问,机器内存少。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 }