当前位置:   article > 正文

Java解析XML的四种方法

java解析xml的四种方法

简介

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。


XML文件解析方法 

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

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <employees>   
  3.   <employee>   
  4.     <name>ddviplinux</name>   
  5.     <sex>m</sex>   
  6.     <age>30</age>   
  7.   </employee>   
  8. </employees>  

本文实现DOM与SAX的XML文档生成与解析。 

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

[java]  view plain  copy
  1. package com.alisoft.facepay.framework.bean;  
  2.   
  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.     /** 
  16.      * 解析XML文档 
  17.      * @param fileName 文件全路径名称 
  18.      */  
  19.     public void parserXml(String fileName);  
  20. }  

1.DOM生成和解析XML文档

为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。 

(1)DOM解析XML文档所使用到的jar:dom.jar

(2)DOM解析与创建XML文档示例代码

[java]  view plain  copy
  1. package com.alisoft.facepay.framework.bean;  
  2.   
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7.   
  8. import javax.xml.parsers.DocumentBuilder;  
  9. import javax.xml.parsers.DocumentBuilderFactory;  
  10. import javax.xml.parsers.ParserConfigurationException;  
  11. import javax.xml.transform.OutputKeys;  
  12. import javax.xml.transform.Transformer;  
  13. import javax.xml.transform.TransformerConfigurationException;  
  14. import javax.xml.transform.TransformerException;  
  15. import javax.xml.transform.TransformerFactory;  
  16. import javax.xml.transform.dom.DOMSource;  
  17. import javax.xml.transform.stream.StreamResult;  
  18.   
  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. /** 
  26.  *  
  27.  * @author hongliang.dinghl DOM生成与解析XML文档 
  28.  */  
  29. public class DomDemo implements XmlDocument {  
  30.     private Document document;  
  31.     private String fileName;  
  32.       
  33.     public void init() {  
  34.         try {  
  35.             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  36.             DocumentBuilder builder = factory.newDocumentBuilder();  
  37.             this.document = builder.newDocument();  
  38.         } catch(ParserConfigurationException  e) {  
  39.             System.out.println(e.getMessage());  
  40.         }  
  41.     }  
  42.       
  43.     //创建一个xml文件  
  44.     public void createXml(String fileName) {  
  45.         Element root = this.document.createElement("employees");  //创建一个xml文件根节点  
  46.         this.document.appendChild(root); //把根节点加到xml文档结构下面  
  47.         Element employee = this.document.createElement("employee"); //创过employee节点  
  48.         Element name = this.document.createElement("name"); //创建name节点  
  49.         name.appendChild(this.document.createTextNode("丁宏亮")); //创建一个内容,并把内容加到name节点下面  
  50.         employee.appendChild(name);  //把name加到employee下面  
  51.         Element sex = this.document.createElement("sex"); //创建军一个sex节点  
  52.         sex.appendChild(this.document.createTextNode("m")); //创建一个性别添加到性别节点下面  
  53.         employee.appendChild(sex); //把性别添加到,人员节点下面  
  54.         Element age = this.document.createElement("age");   
  55.         age.appendChild(this.document.createTextNode("30"));   
  56.         employee.appendChild(age);   
  57.         root.appendChild(employee);   
  58.         TransformerFactory tf = TransformerFactory.newInstance();   
  59.         try {   
  60.             Transformer transformer = tf.newTransformer();   
  61.             DOMSource source = new DOMSource(document);   
  62.             transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");   
  63.             transformer.setOutputProperty(OutputKeys.INDENT, "yes");   
  64.             PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));    
  65.             StreamResult result = new StreamResult(pw);   
  66.             transformer.transform(source, result);   
  67.             System.out.println("生成XML文件成功!");   
  68.         } catch (TransformerConfigurationException e) {   
  69.             System.out.println(e.getMessage());   
  70.         } catch (IllegalArgumentException e) {   
  71.             System.out.println(e.getMessage());   
  72.         } catch (FileNotFoundException e) {   
  73.             System.out.println(e.getMessage());   
  74.         } catch (TransformerException e) {   
  75.             System.out.println(e.getMessage());   
  76.         }   
  77.   
  78.     }  
  79.   
  80.     //解释一个XML文件  
  81.     public void parserXml(String fileName) {  
  82.         try {  
  83.             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
  84.             DocumentBuilder db = dbf.newDocumentBuilder();  
  85.             Document document = db.parse(fileName); // 读取xml文件  
  86.             NodeList employees = document.getChildNodes();  
  87.   
  88.             for (int i = 0; i < employees.getLength(); i++) {  
  89.                 Node employee = employees.item(i);  
  90.                 NodeList employeeInfo = employee.getChildNodes();  
  91.                 for (int j = 0; j < employeeInfo.getLength(); j++) {  
  92.                     Node node = employeeInfo.item(j);  
  93.                     NodeList employeeMeta = node.getChildNodes();  
  94.                     for (int k = 0; k < employeeMeta.getLength(); k++) {  
  95.                         System.out.println(employeeMeta.item(k).getNodeName()  
  96.                                 + ":" + employeeMeta.item(k).getTextContent());  
  97.                     }  
  98.                 }  
  99.             }  
  100.   
  101.             System.out.println("解析完毕");  
  102.         } catch (FileNotFoundException e) {  
  103.             System.out.println(e.getMessage());  
  104.         } catch (ParserConfigurationException e) {  
  105.             System.out.println(e.getMessage());  
  106.         } catch (SAXException e) {  
  107.             System.out.println(e.getMessage());  
  108.         } catch (IOException e) {  
  109.             System.out.println(e.getMessage());  
  110.         }  
  111.     }   
  112.   
  113. }  

2.SAX生成和解析XML文档

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

(1)SAX解析XML文档所使用到的jar包:sax.jar

(2)SAX关健类的,类结构图

(3)SAX文档解释示例代码

[java]  view plain  copy
  1. package com.alisoft.facepay.framework.bean;  
  2.   
  3. import java.io.BufferedOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.PrintStream;  
  9. import org.xml.sax.Attributes;  
  10. import org.xml.sax.ContentHandler;  
  11. import org.xml.sax.ErrorHandler;  
  12. import org.xml.sax.InputSource;  
  13. import org.xml.sax.Locator;  
  14. import org.xml.sax.SAXException;  
  15. import org.xml.sax.SAXParseException;  
  16. import org.xml.sax.XMLReader;  
  17. import org.xml.sax.helpers.XMLReaderFactory;  
  18.   
  19. public class XMLParser {  
  20.     protected PrintStream output = new PrintStream(new BufferedOutputStream(  
  21.             new FileOutputStream(java.io.FileDescriptor.out), 128), true);  
  22.     // handler error info.  
  23.     protected PrintStream error = new PrintStream(new BufferedOutputStream(  
  24.             new FileOutputStream(java.io.FileDescriptor.err), 128), true);  
  25.   
  26.     public void parserXMLFile(String fileName) throws SAXException, IOException {  
  27.         XMLReader reader = XMLReaderFactory.createXMLReader();  
  28.         reader.setContentHandler(new MyContentHandler());  
  29.         reader.setErrorHandler(new MyErrorHandler());  
  30.         InputSource source = new InputSource(new FileInputStream(new File(  
  31.                 fileName)));  
  32.         reader.parse(source);  
  33.     }  
  34.   
  35.     class MyErrorHandler implements ErrorHandler {  
  36.   
  37.         public void error(SAXParseException exception) throws SAXException {  
  38.   
  39.             error.println(exception.getMessage());  
  40.         }  
  41.   
  42.         public void fatalError(SAXParseException exception) throws SAXException {  
  43.   
  44.             error.println(exception.getMessage());  
  45.         }  
  46.   
  47.         public void warning(SAXParseException exception) throws SAXException {  
  48.             output.println(exception.getMessage());  
  49.   
  50.         }  
  51.   
  52.     }  
  53.   
  54.     class MyContentHandler implements ContentHandler {  
  55.   
  56.         private StringBuffer buffer = new StringBuffer();  
  57.         private String key;  
  58.   
  59.         public void characters(char[] ch, int start, int length)  
  60.                 throws SAXException {  
  61.             buffer.append(ch, start, length); // 添加标记中间的内容  
  62.   
  63.         }  
  64.   
  65.         public void endDocument() throws SAXException {  
  66.   
  67.         }  
  68.   
  69.         public void endElement(String uri, String localName, String name)  
  70.                 throws SAXException {  
  71.             if (key.equals(localName)) {  
  72.                 output.print(buffer); // 输出标记中间的内容  
  73.             }  
  74.             output.print("</" + localName + ">");  
  75.         }  
  76.   
  77.         public void endPrefixMapping(String prefix) throws SAXException {  
  78.         }  
  79.   
  80.         public void ignorableWhitespace(char[] ch, int start, int length)  
  81.                 throws SAXException {  
  82.         }  
  83.   
  84.         public void processingInstruction(String target, String data)  
  85.                 throws SAXException {  
  86.         }  
  87.   
  88.         public void setDocumentLocator(Locator locator) {  
  89.         }  
  90.   
  91.         public void skippedEntity(String name) throws SAXException {  
  92.         }  
  93.   
  94.         public void startDocument() throws SAXException // XML文档开始读取时调用  
  95.         {  
  96.             output.println("<xml version=\"1.0\" encoding=\"utf-8\"?>");  
  97.         }  
  98.   
  99.         public void startElement(String uri, String localName, String name,  
  100.                 Attributes atts) throws SAXException // 获取标记开始信息  
  101.         {  
  102.             // uri is identifier of namespace  
  103.             // name-->prefix:localName  
  104.   
  105.             buffer.delete(0, buffer.length());  
  106.             key = localName;  
  107.   
  108.             output.print("<" + localName);  
  109.             for (int i = 0; i < atts.getLength(); i++) {  
  110.                 String attrName = atts.getLocalName(i);  
  111.                 String attrValue = atts.getValue(i);  
  112.                 output.print(" " + attrName + "=" + attrValue);  
  113.             }  
  114.             output.print(">" + "\r");  
  115.         }  
  116.   
  117.         public void startPrefixMapping(String prefix, String uri)  
  118.                 throws SAXException {  
  119.         }  
  120.     }  
  121.   
  122.     public static void main(String[] args) throws Exception, IOException {  
  123.         XMLParser parser = new XMLParser();  
  124.         parser.parserXMLFile("D:/testSpace/testPrj/src/xmlPackage/MyXml.xml"); // 解释XML文件  
  125.     }  
  126. }  

(4)SAX生成XML文档示例代码(生成XML)

[java]  view plain  copy
  1. package com.alisoft.facepay.framework.bean;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.StringWriter;  
  5. import javax.xml.transform.OutputKeys;  
  6. import javax.xml.transform.Result;  
  7. import javax.xml.transform.Transformer;  
  8. import javax.xml.transform.TransformerConfigurationException;  
  9. import javax.xml.transform.sax.SAXTransformerFactory;  
  10. import javax.xml.transform.sax.TransformerHandler;  
  11. import javax.xml.transform.stream.StreamResult;  
  12. import org.xml.sax.SAXException;  
  13. import org.xml.sax.helpers.AttributesImpl;  
  14.   
  15. public class XMLHandler {  
  16.     public String createXMLFile() {  
  17.         String xmlStr = null;  
  18.         try {  
  19.             Result resultXml = new StreamResult(new FileOutputStream(  
  20.                     "E://cities.xml"));  
  21.             StringWriter writerStr = new StringWriter();  
  22.             SAXTransformerFactory sff = (SAXTransformerFactory) SAXTransformerFactory  
  23.                     .newInstance();  
  24.             TransformerHandler th = sff.newTransformerHandler();  
  25.             Transformer transformer = th.getTransformer();  
  26.             transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
  27.             transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");  
  28.             th.setResult(resultXml);  
  29.             th.startDocument();  
  30.             String four = "\n    ";  
  31.             String eight = "\n        ";  
  32.             AttributesImpl attr = new AttributesImpl();  
  33.             th.startElement("""""country", attr);  
  34.             th.characters(four.toCharArray(), 0, four.length());  
  35.   
  36.             th.startElement("""""china", attr);  
  37.   
  38.             th.characters(eight.toCharArray(), 0, eight.length());  
  39.   
  40.             th.startElement("""""city", attr);  
  41.             String bj = "Beijing";  
  42.             th.characters(bj.toCharArray(), 0, bj.length());  
  43.             th.endElement("""""city");  
  44.   
  45.             th.characters(eight.toCharArray(), 0, eight.length());  
  46.   
  47.             th.startElement("""""city", attr);  
  48.             String sh = "Shanghai";  
  49.             th.characters(sh.toCharArray(), 0, sh.length());  
  50.             th.endElement("""""city");  
  51.   
  52.             th.characters(four.toCharArray(), 0, four.length());  
  53.   
  54.             th.endElement("""""china");  
  55.             th.endElement("""""country");  
  56.             th.endDocument();  
  57.             xmlStr = writerStr.getBuffer().toString();  
  58.         } catch (TransformerConfigurationException e) {  
  59.             e.printStackTrace();  
  60.         } catch (SAXException e) {  
  61.             e.printStackTrace();  
  62.         } catch (Exception e) {  
  63.             e.printStackTrace();  
  64.         }  
  65.         return xmlStr;  
  66.     }  
  67.   
  68.     public static void main(String args[]) {  
  69.         XMLHandler xh = new XMLHandler();  
  70.         xh.createXMLFile();  
  71.     }  
  72. }  

生成的XML文档:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <country>  
  3.     <china>  
  4.         <city>Beijing</city>  
  5.         <city>Shanghai</city>  
  6.     </china>  
  7. </country>  

3.DOM4J生成和解析XML文档

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的JAXM 也在用 DOM4J。

(1)Dom4j解析XML文档所使用到的jar包:dom4j.jar

(2)Dom4j文档解释示例代码

[java]  view plain  copy
  1. package com.alisoft.facepay.framework.bean;  
  2.   
  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.   
  9. import org.dom4j.Document;  
  10. import org.dom4j.DocumentException;  
  11. import org.dom4j.DocumentHelper;  
  12. import org.dom4j.Element;  
  13. import org.dom4j.io.SAXReader;  
  14. import org.dom4j.io.XMLWriter;  
  15.   
  16. /** 
  17.  *  
  18.  * @author hongliang.dinghl Dom4j 生成XML文档与解析XML文档 
  19.  */  
  20. public class Dom4jDemo implements XmlDocument {  
  21.   
  22.     // Dom4j创建Xml文档  
  23.     public void createXml(String fileName) {  
  24.         Document document = DocumentHelper.createDocument(); // 创建一个文档对象  
  25.         Element employees = document.addElement("employees"); // 在根节点添加元素  
  26.         Element employee = employees.addElement("employee"); // 在employees下添加子节点  
  27.         Element name = employee.addElement("name"); // 在employee下添加子节点  
  28.         name.setText("ddvip"); // 给name节点添加内容  
  29.         Element sex = employee.addElement("sex");  
  30.         sex.setText("m");  
  31.         Element age = employee.addElement("age");  
  32.         age.setText("29");  
  33.         try {  
  34.             Writer fileWriter = new FileWriter(fileName);  
  35.             XMLWriter xmlWriter = new XMLWriter(fileWriter);  
  36.             xmlWriter.write(document);  
  37.             xmlWriter.close();  
  38.         } catch (IOException e) {  
  39.   
  40.             System.out.println(e.getMessage());  
  41.         }  
  42.   
  43.     }  
  44.   
  45.     // Dom4j解释Xml文档  
  46.     public void parserXml(String fileName) {  
  47.         File inputXml = new File(fileName);  
  48.         SAXReader saxReader = new SAXReader();  
  49.         try {  
  50.             Document document = saxReader.read(inputXml);  
  51.             Element employees = document.getRootElement();  
  52.             for (Iterator i = employees.elementIterator(); i.hasNext();) {  
  53.                 Element employee = (Element) i.next();  
  54.                 for (Iterator j = employee.elementIterator(); j.hasNext();) { // 遍例节点  
  55.                     Element node = (Element) j.next();  
  56.                     System.out.println(node.getName() + ":" + node.getText());  
  57.                 }  
  58.   
  59.             }  
  60.         } catch (DocumentException e) {  
  61.             System.out.println(e.getMessage());  
  62.         }  
  63.         System.out.println("dom4j parserXml");  
  64.     }  
  65. }  

4.JDOM生成和解析XML

为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。

(1)JDOM解析XML文档所使用到的jar包jdom.jar
(2)JDOM文档解释示例代码

[java]  view plain  copy
  1. package com.alisoft.facepay.framework.bean;  
  2.   
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.util.List;  
  7.   
  8. import org.jdom.Document;  
  9. import org.jdom.Element;  
  10. import org.jdom.JDOMException;  
  11. import org.jdom.input.SAXBuilder;  
  12. import org.jdom.output.XMLOutputter;  
  13.   
  14. /** 
  15.  *  
  16.  * @author hongliang.dinghl JDOM 生成与解析XML文档 
  17.  *  
  18.  */  
  19. public class JDomDemo implements XmlDocument {  
  20.   
  21.     public void createXml(String fileName) {  
  22.         Document document;  
  23.         Element root;  
  24.         root = new Element("employees");  
  25.         document = new Document(root);  
  26.         Element employee = new Element("employee");  
  27.         root.addContent(employee);  
  28.         Element name = new Element("name");  
  29.         name.setText("ddvip");  
  30.         employee.addContent(name);  
  31.         Element sex = new Element("sex");  
  32.         sex.setText("m");  
  33.         employee.addContent(sex);  
  34.         Element age = new Element("age");  
  35.         age.setText("23");  
  36.         employee.addContent(age);  
  37.         XMLOutputter XMLOut = new XMLOutputter();  
  38.         try {  
  39.             XMLOut.output(document, new FileOutputStream(fileName));  
  40.         } catch (FileNotFoundException e) {  
  41.             e.printStackTrace();  
  42.         } catch (IOException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  
  46.   
  47.     public void parserXml(String fileName) {  
  48.         SAXBuilder builder = new SAXBuilder(false);  
  49.         try {  
  50.             Document document = builder.build(fileName);  
  51.             Element employees = document.getRootElement();  
  52.             List employeeList = employees.getChildren();  
  53.             // 获取employee节点  
  54.             for (int i = 0; i < employeeList.size(); i++) {  
  55.                 Element employee = (Element) employeeList.get(i);  
  56.                 List employeeInfo = employee.getChildren();  
  57.                 // 获取employee节点下面的所有子节点  
  58.                 for(int j = 0; j < employeeInfo.size(); j++) {  
  59.                     Element info = (Element)employeeInfo.get(j);  
  60.                     System.out.println(info.getName() + ":" + info.getValue());  
  61.                 }  
  62.             }  
  63.         } catch (JDOMException  e) {  
  64.             System.out.println(e.getMessage());  
  65.         } catch (IOException e) {  
  66.             System.out.println(e.getMessage());  
  67.         }  
  68.     }  
  69. }  
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/817626
推荐阅读
相关标签
  

闽ICP备14008679号