zoukankan      html  css  js  c++  java
  • Java学习之路:详细解释Java解析XML四种方法

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

    对于XML本身的语法知识与技术细节,须要阅读相关的技术文献,这里面包含的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),详细可參阅w3c官方站点文档http://www.w3.org获取很多其它信息。

    XML在不同的语言里解析方式都是一样的,仅仅只是实现的语法不同而已。

    主要的解析方式有两种,一种叫SAX。还有一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。如果我们XML的内容和结构例如以下: 

    <?xml version="1.0" encoding="UTF-8"?> 
    <employees>
    <employee>
    <name>ddviplinux</name>
    <sex>m</sex>
    <age>30</age>
    </employee>
    </employees>

    本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。 
    首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。

    package com.alisoft.facepay.framework.bean; 
    /**
    *
    * @author hongliang.dinghl
    * 定义XML文档建立与解析的接口
    */
    public interface XmlDocument {
    /**
    * 建立XML文档
    * @param fileName 文件全路径名称
    */
    public void createXml(String fileName);
    /**
    * 解析XML文档
    * @param fileName 文件全路径名称
    */
    public void parserXml(String fileName);
    }

    1.DOM生成和解析XML文档

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

    package com.alisoft.facepay.framework.bean; 
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    /**
    *
    * @author hongliang.dinghl
    * DOM生成与解析XML文档
    */
    public class DomDemo implements XmlDocument {
    private Document document;
    private String fileName;
    public void init() {
    try {
    DocumentBuilderFactory factory = DocumentBuilderFactory
    .newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    this.document = builder.newDocument();
    } catch (ParserConfigurationException e) {
    System.out.println(e.getMessage());
    }
    }
    public void createXml(String fileName) {
    Element root = this.document.createElement("employees");
    this.document.appendChild(root);
    Element employee = this.document.createElement("employee");
    Element name = this.document.createElement("name");
    name.appendChild(this.document.createTextNode("丁宏亮"));
    employee.appendChild(name);
    Element sex = this.document.createElement("sex");
    sex.appendChild(this.document.createTextNode("m"));
    employee.appendChild(sex);
    Element age = this.document.createElement("age");
    age.appendChild(this.document.createTextNode("30"));
    employee.appendChild(age);
    root.appendChild(employee);
    TransformerFactory tf = TransformerFactory.newInstance();
    try {
    Transformer transformer = tf.newTransformer();
    DOMSource source = new DOMSource(document);
    transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    StreamResult result = new StreamResult(pw);
    transformer.transform(source, result);
    System.out.println("生成XML文件成功!");
    } catch (TransformerConfigurationException e) {
    System.out.println(e.getMessage());
    } catch (IllegalArgumentException e) {
    System.out.println(e.getMessage());
    } catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
    } catch (TransformerException e) {
    System.out.println(e.getMessage());
    }
    }
    public void parserXml(String fileName) {
    try {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(fileName);
    NodeList employees = document.getChildNodes();
    for (int i = 0; i < employees.getLength(); i++) {
    Node employee = employees.item(i);
    NodeList employeeInfo = employee.getChildNodes();
    for (int j = 0; j < employeeInfo.getLength(); j++) {
    Node node = employeeInfo.item(j);
    NodeList employeeMeta = node.getChildNodes();
    for (int k = 0; k < employeeMeta.getLength(); k++) {
    System.out.println(employeeMeta.item(k).getNodeName()
    + ":" + employeeMeta.item(k).getTextContent());
    }
    }
    }
    System.out.println("解析完成");
    } catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
    } catch (ParserConfigurationException e) {
    System.out.println(e.getMessage());
    } catch (SAXException e) {
    System.out.println(e.getMessage());
    } catch (IOException e) {
    System.out.println(e.getMessage());
    }
    }
    }

    2.SAX生成和解析XML文档

    为解决DOM的问题。出现了SAX。SAX ,事件驱动。当解析器发现元素開始、元素结束、文本、文档的開始或结束等时。发送事件,程序猿编写响应这些事件的代码。保存数据。长处:不用事先调入整个文档,占用资源少。SAX解析器代码比DOM解析器代码小。适于Applet,下载。

    缺点:不是持久的;事件过后,若没保存数据。那么数据就丢了;无状态性。从事件中仅仅能得到文本。但不知该文本属于哪个元素;使用场合:Applet;仅仅需XML文档的少量内容,非常少回头訪问。机器内存少;

    Java代码

    package com.alisoft.facepay.framework.bean;   
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.IOException;  
    import java.io.InputStream;  

    import javax.xml.parsers.ParserConfigurationException;  
    import javax.xml.parsers.SAXParser;  
    import javax.xml.parsers.SAXParserFactory;  

    import org.xml.sax.Attributes;  
    import org.xml.sax.SAXException;  
    import org.xml.sax.helpers.DefaultHandler;  
    /** 
    *  
    * @author hongliang.dinghl 
    * SAX文档解析 
    */ 
    public class SaxDemo implements XmlDocument {  

    public void createXml(String fileName) {  
    System.out.println("<<"+filename+">>");  
    }  

    public void parserXml(String fileName) {  
    SAXParserFactory saxfac = SAXParserFactory.newInstance();  

    try {  

    SAXParser saxparser = saxfac.newSAXParser();  

    InputStream is = new FileInputStream(fileName);  

    saxparser.parse(is, new MySAXHandler());  

    } catch (ParserConfigurationException e) {  

    e.printStackTrace();  

    } catch (SAXException e) {  

    e.printStackTrace();  

    } catch (FileNotFoundException e) {  

    e.printStackTrace();  

    } catch (IOException e) {  

    e.printStackTrace();  

    }  

    }  

    }  

    class MySAXHandler extends DefaultHandler {  

    boolean hasAttribute = false;  

    Attributes attributes = null;  

    public void startDocument() throws SAXException {  

    System.out.println("文档開始打印了");  

    }  

    public void endDocument() throws SAXException {  

    System.out.println("文档打印结束了");  

    }  

    public void startElement(String uri, String localName, String qName,  

    Attributes attributes) throws SAXException {  

    if (qName.equals("employees")) {  

    return;  

    }  

    if (qName.equals("employee")) {  

    System.out.println(qName);  

    }  

    if (attributes.getLength() > 0) {  

    this.attributes = attributes;  

    this.hasAttribute = true;  

    }  

    }  

    public void endElement(String uri, String localName, String qName)  

    throws SAXException {  

    if (hasAttribute && (attributes != null)) {  

    for (int i = 0; i < attributes.getLength(); i++) {  

    System.out.println(attributes.getQName(0)  
    + attributes.getValue(0));  

    }  

    }  

    }  

    public void characters(char[] ch, int start, int length)  

    throws SAXException {  

    System.out.println(new String(ch, start, length));  

    }  


    package com.alisoft.facepay.framework.bean;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    /**
    *
    * @author hongliang.dinghl
    * SAX文档解析
    */
    public class SaxDemo implements XmlDocument {
    public void createXml(String fileName) {
    System.out.println("<<"+filename+">>");
    }
    public void parserXml(String fileName) {
    SAXParserFactory saxfac = SAXParserFactory.newInstance();
    try {
    SAXParser saxparser = saxfac.newSAXParser();
    InputStream is = new FileInputStream(fileName);
    saxparser.parse(is, new MySAXHandler());
    } catch (ParserConfigurationException e) {
    e.printStackTrace();
    } catch (SAXException e) {
    e.printStackTrace();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    class MySAXHandler extends DefaultHandler {
    boolean hasAttribute = false;
    Attributes attributes = null;
    public void startDocument() throws SAXException {
    System.out.println("文档開始打印了");
    }
    public void endDocument() throws SAXException {
    System.out.println("文档打印结束了");
    }
    public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
    if (qName.equals("employees")) {
    return;
    }
    if (qName.equals("employee")) {
    System.out.println(qName);
    }
    if (attributes.getLength() > 0) {
    this.attributes = attributes;
    this.hasAttribute = true;
    }
    }
    public void endElement(String uri, String localName, String qName)
    throws SAXException {
    if (hasAttribute && (attributes != null)) {
    for (int i = 0; i < attributes.getLength(); i++) {
    System.out.println(attributes.getQName(0)
    + attributes.getValue(0));
    }
    }
    }
    public void characters(char[] ch, int start, int length)
    throws SAXException {
    System.out.println(new String(ch, start, length));
    }
    }

    3.DOM4J生成和解析XML文档

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

    Java代码

    package com.alisoft.facepay.framework.bean;   
    import java.io.File;  
    import java.io.FileWriter;  
    import java.io.IOException;  
    import java.io.Writer;  
    import java.util.Iterator;  

    import org.dom4j.Document;  
    import org.dom4j.DocumentException;  
    import org.dom4j.DocumentHelper;  
    import org.dom4j.Element;  
    import org.dom4j.io.SAXReader;  
    import org.dom4j.io.XMLWriter;  
    /** 
    *  
    * @author hongliang.dinghl 
    * Dom4j 生成XML文档与解析XML文档 
    */ 
    public class Dom4jDemo implements XmlDocument {  

    public void createXml(String fileName) {  
    Document document = DocumentHelper.createDocument();  
    Element employees=document.addElement("employees");  
    Element employee=employees.addElement("employee");  
    Element name= employee.addElement("name");  
    name.setText("ddvip");  
    Element sex=employee.addElement("sex");  
    sex.setText("m");  
    Element age=employee.addElement("age");  
    age.setText("29");  
    try {  
    Writer fileWriter=new FileWriter(fileName);  
    XMLWriter xmlWriter=new XMLWriter(fileWriter);  
    xmlWriter.write(document);  
    xmlWriter.close();  
    } catch (IOException e) {  

    System.out.println(e.getMessage());  
    }  


    }  


    public void parserXml(String fileName) {  
    File inputXml=new File(fileName);  
    SAXReader saxReader = new SAXReader();  
    try {  
    Document document = saxReader.read(inputXml);  
    Element employees=document.getRootElement();  
    for(Iterator i = employees.elementIterator(); i.hasNext();){  
    Element employee = (Element) i.next();  
    for(Iterator j = employee.elementIterator(); j.hasNext();){  
    Element node=(Element) j.next();  
    System.out.println(node.getName()+":"+node.getText());  
    }  

    }  
    } catch (DocumentException e) {  
    System.out.println(e.getMessage());  
    }  
    System.out.println("dom4j parserXml");  
    }   
    }  

    4.JDOM生成和解析XML  

    为降低DOM、SAX的编码量。出现了JDOM。长处:20-80原则,极大降低了代码量。

    使用场合:要实现的功能简单。如解析、创建等,但在底层,JDOM还是使用SAX(最经常使用)、DOM、Xanan文档。

       
    package com.alisoft.facepay.framework.bean;   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />import java.io.FileNotFoundException;   <br style="clear: both;  0px; height: 0px; " />import java.io.FileOutputStream;   <br style="clear: both;  0px; height: 0px; " />import java.io.IOException;   <br style="clear: both;  0px; height: 0px; " />import java.util.List;   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />import org.jdom.Document;   <br style="clear: both;  0px; height: 0px; " />import org.jdom.Element;   <br style="clear: both;  0px; height: 0px; " />import org.jdom.JDOMException;   <br style="clear: both;  0px; height: 0px; " />import org.jdom.input.SAXBuilder;   <br style="clear: both;  0px; height: 0px; " />import org.jdom.output.XMLOutputter;   <br style="clear: both;  0px; height: 0px; " />/**  <br style="clear: both;  0px; height: 0px; " />*   <br style="clear: both;  0px; height: 0px; " />* @author hongliang.dinghl  <br style="clear: both;  0px; height: 0px; " />* JDOM 生成与解析XML文档  <br style="clear: both;  0px; height: 0px; " />*   <br style="clear: both;  0px; height: 0px; " />*/  <br style="clear: both;  0px; height: 0px; " />public class JDomDemo implements XmlDocument {   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />public void createXml(String fileName) {   <br style="clear: both;  0px; height: 0px; " />Document document;   <br style="clear: both;  0px; height: 0px; " />Element  root;   <br style="clear: both;  0px; height: 0px; " />root=new Element("employees");   <br style="clear: both;  0px; height: 0px; " />document=new Document(root);   <br style="clear: both;  0px; height: 0px; " />Element employee=new Element("employee");   <br style="clear: both;  0px; height: 0px; " />root.addContent(employee);   <br style="clear: both;  0px; height: 0px; " />Element name=new Element("name");   <br style="clear: both;  0px; height: 0px; " />name.setText("ddvip");   <br style="clear: both;  0px; height: 0px; " />employee.addContent(name);   <br style="clear: both;  0px; height: 0px; " />Element sex=new Element("sex");   <br style="clear: both;  0px; height: 0px; " />sex.setText("m");   <br style="clear: both;  0px; height: 0px; " />employee.addContent(sex);   <br style="clear: both;  0px; height: 0px; " />Element age=new Element("age");   <br style="clear: both;  0px; height: 0px; " />age.setText("23");   <br style="clear: both;  0px; height: 0px; " />employee.addContent(age);   <br style="clear: both;  0px; height: 0px; " />XMLOutputter XMLOut = new XMLOutputter();   <br style="clear: both;  0px; height: 0px; " />try {   <br style="clear: both;  0px; height: 0px; " />XMLOut.output(document, new FileOutputStream(fileName));   <br style="clear: both;  0px; height: 0px; " />} catch (FileNotFoundException e) {   <br style="clear: both;  0px; height: 0px; " />e.printStackTrace();   <br style="clear: both;  0px; height: 0px; " />} catch (IOException e) {   <br style="clear: both;  0px; height: 0px; " />e.printStackTrace();   <br style="clear: both;  0px; height: 0px; " />}   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />}   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />public void parserXml(String fileName) {   <br style="clear: both;  0px; height: 0px; " />SAXBuilder builder=new SAXBuilder(false);    <br style="clear: both;  0px; height: 0px; " />try {   <br style="clear: both;  0px; height: 0px; " />Document document=builder.build(fileName);   <br style="clear: both;  0px; height: 0px; " />Element employees=document.getRootElement();    <br style="clear: both;  0px; height: 0px; " />List employeeList=employees.getChildren("employee");   <br style="clear: both;  0px; height: 0px; " />for(int i=0;i<employeelist.size();i++){ 
    Element employee=(Element)employeeList.get(i);   <br style="clear: both;  0px; height: 0px; " />List employeeInfo=employee.getChildren();   <br style="clear: both;  0px; height: 0px; " />for(int j=0;j<employeeinfo.size();j++){ 
    System.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />}   <br style="clear: both;  0px; height: 0px; " />}   <br style="clear: both;  0px; height: 0px; " />} catch (JDOMException e) {   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />e.printStackTrace();   <br style="clear: both;  0px; height: 0px; " />} catch (IOException e) {   <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />e.printStackTrace();   <br style="clear: both;  0px; height: 0px; " />}    <br style="clear: both;  0px; height: 0px; " /><br style="clear: both;  0px; height: 0px; " />}   <br style="clear: both;  0px; height: 0px; " />}   <br style="clear: both;  0px; height: 0px; " />  

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4675233.html
Copyright © 2011-2022 走看看