现在的位置: 首页 > 综合 > 正文

java解析XML的四种方式及比较

2015年11月10日 ⁄ 综合 ⁄ 共 11834字 ⁄ 字号 评论关闭

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible
Stylesheet Language Transformations),

XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:

  1. view plaincopy to clipboardprint?   
  2. <?xml version=”1.0″ encoding=”UTF-8″?> <employees>   
  3. <employee>   
  4. <name>ddviplinux</name>   
  5. <sex>m</sex>   
  6. <age>30</age>   
  7. </employee>   
  8. </employees>   
  9. <?xml version=”1.0″ encoding=”UTF-8″?> <employees>   
  10. <employee>   
  11. <name>ddviplinux</name>   
  12. <sex>m</sex>   
  13. <age>30</age>   
  14. </employee>   
  15. </employees>  

本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。

首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。

  1. view plaincopy to clipboardprint?   
  2. package com.alisoft.facepay.framework.bean;   
  3. /**   
  4. *   
  5. * @author hongliang.dinghl   
  6. * 定义XML文档建立与解析的接口   
  7. */   
  8. public interface XmlDocument {   
  9. /**   
  10. * 建立XML文档   
  11. * @param fileName 文件全路径名称   
  12. */   
  13. public void createXml(String fileName);   
  14. /**   
  15. * 解析XML文档   
  16. * @param fileName 文件全路径名称   
  17. */   
  18. 18.public void parserXml(String fileName);   
  19. 19.}   
  20. 20.package com.alisoft.facepay.framework.bean;   
  21. 21./**   
  22. 22. *   
  23. 23. * @author hongliang.dinghl   
  24. * 定义XML文档建立与解析的接口   
  25. */   
  26. public interface XmlDocument {   
  27. /**   
  28. * 建立XML文档   
  29. * @param fileName 文件全路径名称   
  30. */   
  31. public void createXml(String fileName);   
  32. /**   
  33. * 解析XML文档   
  34. * @param fileName 文件全路径名称   
  35. */   
  36. public void parserXml(String fileName);   
  37. }
  38.  
  39. 1. DOM生成和解析XML文档
  40. 为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。

    1. view plaincopy to clipboardprint?   
    2. package com.alisoft.facepay.framework.bean;   
    3. import java.io.FileInputStream;   
    4. import java.io.FileNotFoundException;   
    5. import java.io.FileOutputStream;   
    6. import java.io.IOException;   
    7. import java.io.InputStream;   
    8. import java.io.PrintWriter;   
    9. import javax.xml.parsers.DocumentBuilder;   
    10. import javax.xml.parsers.DocumentBuilderFactory;   
    11. import javax.xml.parsers.ParserConfigurationException;   
    12. import javax.xml.transform.OutputKeys;   
    13. import javax.xml.transform.Transformer;   
    14. import javax.xml.transform.TransformerConfigurationException;   
    15. import javax.xml.transform.TransformerException;   
    16. import javax.xml.transform.TransformerFactory;   
    17. import javax.xml.transform.dom.DOMSource;   
    18. import javax.xml.transform.stream.StreamResult;   
    19. import org.w3c.dom.Document;   
    20. import org.w3c.dom.Element;   
    21. import org.w3c.dom.Node;   
    22. import org.w3c.dom.NodeList;   
    23. import org.xml.sax.SAXException;   
    24. /**   
    25. * @author hongliang.dinghl   
    26. * DOM生成与解析XML文档   
    27. */   
    28. public class DomDemo implements XmlDocument {   
    29. private Document document;   
    30. private String fileName;   
    31. public void init() {   
    32. try {   
    33. DocumentBuilderFactory factory = DocumentBuilderFactory   
    34. .newInstance();   
    35. DocumentBuilder builder = factory.newDocumentBuilder();   
    36. this.document = builder.newDocument();   
    37. catch (ParserConfigurationException e) {   
    38. System.out.println(e.getMessage());   
    39. }   
    40. }   
    41. public void createXml(String fileName) {   
    42. Element root = this.document.createElement(“employees”);   
    43. this.document.appendChild(root);   
    44. Element employee = this.document.createElement(“employee”);   
    45. Element name = this.document.createElement(“name”);   
    46. name.appendChild(this.document.createTextNode(“丁宏亮“));   
    47. employee.appendChild(name);   
    48. Element sex = this.document.createElement(“sex”);   
    49. sex.appendChild(this.document.createTextNode(“m”));   
    50. employee.appendChild(sex);   
    51. Element age = this.document.createElement(“age”);   
    52. age.appendChild(this.document.createTextNode(“30″));   
    53. employee.appendChild(age);   
    54. root.appendChild(employee);   
    55. TransformerFactory tf = TransformerFactory.newInstance();   
    56. try {   
    57. Transformer transformer = tf.newTransformer();   
    58. DOMSource source = new DOMSource(document);   
    59. transformer.setOutputProperty(OutputKeys.ENCODING, “gb2312″);   
    60. transformer.setOutputProperty(OutputKeys.INDENT, “yes”);   
    61. PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));   
    62. StreamResult result = new StreamResult(pw);   
    63. transformer.transform(source, result);   
    64. System.out.println(“生成XML文件成功!”);   
    65. catch (TransformerConfigurationException e) {   
    66. System.out.println(e.getMessage());   
    67. catch (IllegalArgumentException e) {   
    68. System.out.println(e.getMessage());   
    69. catch (FileNotFoundException e) {   
    70. System.out.println(e.getMessage());   
    71. catch (TransformerException e) {   
    72. System.out.println(e.getMessage());   
    73. }   
    74. }   
    75. public void parserXml(String fileName) {   
    76. try {   
    77. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
    78. DocumentBuilder db = dbf.newDocumentBuilder();   
    79. Document document = db.parse(fileName);   
    80. NodeList employees = document.getChildNodes();   
    81. for (int i = 0; i < employees.getLength(); i++) {   
    82. Node employee = employees.item(i);   
    83. NodeList employeeInfo = employee.getChildNodes();   
    84. for (int j = 0; j < employeeInfo.getLength(); j++) {   
    85. Node node = employeeInfo.item(j);   
    86. NodeList employeeMeta = node.getChildNodes();   
    87. for (int k = 0; k < employeeMeta.getLength(); k++) {   
    88. System.out.println(employeeMeta.item(k).getNodeName()   
    89.  + “:” + employeeMeta.item(k).getTextContent());   
    90. }   
    91. }   
    92. }   
    93. System.out.println(“解析完毕“);   
    94. catch (FileNotFoundException e) {   
    95. System.out.println(e.getMessage());   
    96. catch (ParserConfigurationException e) {   
    97. System.out.println(e.getMessage());   
    98. catch (SAXException e) {   
    99. System.out.println(e.getMessage());   
    100. catch (IOException e) {   
    101. System.out.println(e.getMessage());   
    102. }   
    103. }   
    104. }  
    105. 2. SAX生成和解析XML文档

      为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少

      1. view plaincopy to clipboardprint?   
      2. package com.alisoft.facepay.framework.bean;   
      3. import java.io.FileInputStream;   
      4. import java.io.FileNotFoundException;   
      5. import java.io.IOException;   
      6. import java.io.InputStream;   
      7. import javax.xml.parsers.ParserConfigurationException;   
      8. import javax.xml.parsers.SAXParser;   
      9. import javax.xml.parsers.SAXParserFactory;   
      10. import org.xml.sax.Attributes;   
      11. import org.xml.sax.SAXException;   
      12. import org.xml.sax.helpers.DefaultHandler;   
      13. /**   
      14. * @author hongliang.dinghl   
      15. * SAX文档解析   
      16. */   
      17. public class SaxDemo implements XmlDocument {   
      18. public void createXml(String fileName) {   
      19. System.out.println(“<<”+filename+“>>”);   
      20. }   
      21. public void parserXml(String fileName) {   
      22. SAXParserFactory saxfac = SAXParserFactory.newInstance();   
      23. try {   
      24. SAXParser saxparser = saxfac.newSAXParser();   
      25. InputStream is = new FileInputStream(fileName);   
      26. saxparser.parse(is, new MySAXHandler());   
      27. catch (ParserConfigurationException e) {   
      28. e.printStackTrace();   
      29. catch (SAXException e) {   
      30. e.printStackTrace();   
      31. catch (FileNotFoundException e) {   
      32. e.printStackTrace();   
      33. catch (IOException e) {   
      34. e.printStackTrace();   
      35. }   
      36. }   
      37. }   
      38. class MySAXHandler extends DefaultHandler {   
      39. boolean hasAttribute = false;   
      40. Attributes attributes = null;   
      41. public void startDocument() throws SAXException {   
      42. System.out.println(“文档开始打印了“);   
      43. }   
      44. public void endDocument() throws SAXException {   
      45. System.out.println(“文档打印结束了“);   
      46. }   
      47. public void startElement(String uri, String localName, String qName,   
      48. Attributes attributes) throws SAXException {   
      49. if (qName.equals(“employees”)) {   
      50. return;   
      51. }   
      52. if (qName.equals(“employee”)) {   
      53. System.out.println(qName);   
      54. }   
      55. if (attributes.getLength() > 0) {   
      56. this.attributes = attributes;   
      57. this.hasAttribute = true;   
      58. }   
      59. }   
      60. public void endElement(String uri, String localName, String qName)   
      61. throws SAXException {   
      62. if (hasAttribute && (attributes != null)) {   
      63. for (int i = 0; i < attributes.getLength(); i++) {   
      64. System.out.println(attributes.getQName(0)   
      65. + attributes.getValue(0));   
      66. }   
      67. }   
      68. }   
      69. public void characters(char[] ch, int start, int length)   
      70. throws SAXException {   
      71. System.out.println(new String(ch, start, length));   
      72. }   

      3. DOM4J生成和解析XML文档

      DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。简单易用,采用Java集合框架,并完全支持DOM、SAX和JAXP【优点】①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。②支持XPath。③有很好的性能。【缺点】①大量使用了接口,API较为复杂。

      1. view plaincopy to clipboardprint?   
      2. package com.alisoft.facepay.framework.bean;   
      3. import java.io.File;   
      4. import java.io.FileWriter;   
      5. import java.io.IOException;   
      6. import java.io.Writer;   
      7. import java.util.Iterator;   
      8. import org.dom4j.Document;   
      9. import org.dom4j.DocumentException;   
      10. import org.dom4j.DocumentHelper;   
      11. import org.dom4j.Element;   
      12. import org.dom4j.io.SAXReader;   
      13. import org.dom4j.io.XMLWriter;   
      14. /**   
      15. * @author hongliang.dinghl   
      16. * Dom4j 生成XML文档与解析XML文档   
      17. */   
      18. public class Dom4jDemo implements XmlDocument {   
      19. public void createXml(String fileName) {   
      20. Document document = DocumentHelper.createDocument();   
      21. Element employees=document.addElement(“employees”);   
      22. Element employee=employees.addElement(“employee”);   
      23. Element name= employee.addElement(“name”);   
      24. name.setText(“ddvip”);   
      25. Element sex=employee.addElement(“sex”);   
      26. sex.setText(“m”);   
      27. Element age=employee.addElement(“age”);   
      28. age.setText(“29″);   
      29. try {   
      30. Writer fileWriter=new FileWriter(fileName);   
      31. XMLWriter xmlWriter=new XMLWriter(fileWriter);   
      32. xmlWriter.write(document);   
      33. xmlWriter.close();   
      34. catch (IOException e) {   
      35. System.out.println(e.getMessage());   
      36. }   
      37. }   
      38. public void parserXml(String fileName) {   
      39. File inputXml=new File(fileName);   
      40. SAXReader saxReader = new SAXReader();   
      41. try {   
      42. Document document = saxReader.read(inputXml);   
      43. Element employees=document.getRootElement();   
      44. for(Iterator i = employees.elementIterator(); i.hasNext();){   
      45. Element employee = (Element) i.next();   
      46. for(Iterator j = employee.elementIterator(); j.hasNext();){   
      47. Element node=(Element) j.next();   
      48. System.out.println(node.getName()+“:”+node.getText());   
      49. }   
      50. }   
      51. catch (DocumentException e) {   
      52. System.out.println(e.getMessage());   
      53. }   
      54. System.out.println(“dom4j parserXml”);   
      55. }   
    106. 4. JDOM生成和解析XML

      为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。【优点】①使用具体类而不是接口,简化了DOM的API。②大量使用了Java集合类,方便了Java开发人员。【缺点】①没有较好的灵活性。②性能较差。

      1. view plaincopy to clipboardprint?   
      2. package com.alisoft.facepay.framework.bean;   
      3. import java.io.FileNotFoundException;   
      4. import java.io.FileOutputStream;   
      5. import java.io.IOException;   
      6. import java.util.List;   
      7. import org.jdom.Document;   
      8. import org.jdom.Element;   
      9. import org.jdom.JDOMException;   
      10. import org.jdom.input.SAXBuilder;   
      11. import org.jdom.output.XMLOutputter;   
      12. /**   
      13. * @author hongliang.dinghl   
      14. * JDOM 生成与解析XML文档   
      15. */   
      16. public class JDomDemo implements XmlDocument {   
      17. public void createXml(String fileName) {   
      18. Document document;   
      19. Element root;   
      20. root=new Element(“employees”);   
      21. document=new Document(root);   
      22. Element employee=new Element(“employee”);   
      23. root.addContent(employee);   
      24. Element name=new Element(“name”);   
      25. name.setText(“ddvip”);   
      26. employee.addContent(name);   
      27. Element sex=new Element(“sex”);   
      28. sex.setText(“m”);   
      29. employee.addContent(sex);   
      30. Element age=new Element(“age”);   
      31. age.setText(“23″);   
      32. employee.addContent(age);   
      33. XMLOutputter XMLOut = new XMLOutputter();   
      34. try {   
      35. XMLOut.output(document, new FileOutputStream(fileName));   
      36. catch (FileNotFoundException e) {   
      37. e.printStackTrace();   
      38. catch (IOException e) {   
      39. e.printStackTrace();   
      40. }   
      41. }   
      42. public void parserXml(String fileName) {   
      43. SAXBuilder builder=new SAXBuilder(false);   
      44. try {   
      45. Document document=builder.build(fileName);   
      46. Element employees=document.getRootElement();   
      47. List employeeList=employees.getChildren(“employee”);   
      48. for(int i=0;i<employeeList.size();i++){   
      49. Element employee=(Element)employeeList.get(i);   
      50. List employeeInfo=employee.getChildren();   
      51. for(int j=0;j<employeeInfo.size();j++){   
      52. System.out.println(((Element)employeeInfo.get(j)).getName()+“:”+
      53. ((Element)employeeInfo.get(j)).getValue());   
      54. }   
      55. }   
      56. catch (JDOMException e) {   
      57. e.printStackTrace();   
      58. catch (IOException e) {   
      59. e.printStackTrace();   
      60. }   
      61. }   


    相关文章推荐:

  41. http://wenda.so.com/q/1381541049066825
  42. http://developer.51cto.com/art/201106/270685_3.htm
  43. http://bbs.csdn.net/topics/290027113

抱歉!评论已关闭.