博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML四种解析学习记录
阅读量:5140 次
发布时间:2019-06-13

本文共 11337 字,大约阅读时间需要 37 分钟。

XML文档最基本的解析方式有两种,分别是文档对象模型(Document Object Model简称DOM)和XML解析的简单API(SAX)。

DOM解析是一种基于对象的API,它把XML的内容加载到内存中,生成一个与XML文档内容相对应的对象模型。当解析完成时,内存中会生成XML文档的结构对应的DOM对象树。这样便能够根据树的结构,以节点的形式来对文档进行操作。解析XML文件要比解析字符串、解析Properties文件复杂得多。很显然DOM解析方式由于全部在内存,所以便于操作,但是由于整个文档全部在内存中,因此如果文档很大的时候便会浪费时间和空间。因此出现SAX解析方式,SAX解析基于事件驱动,当解析器发现元素开始、结束、文本、文档的开始或结束等时,发送事件,开发人员自己编写响应这些事件的代码,保存数据。因此这个方式边读入边解析,占用资源少,内存压力小,但不适合CRUD。

下面是本人实现的四种xml解析,都是些简单小程序,希望下次在使用时能有快速找到思路。

1.使用DOM方式解析:

package com.xml.dom;

import java.io.FileOutputStream;
import java.io.IOException;
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.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;
public 
class DomDemo {
    
public 
static 
void createXml(String fileName) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        
try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();
            Element root = document.createElement("students"); 
//
 create the
                                                                
//
 root element.
            document.appendChild(root);
            Element student = document.createElement("student");
            Element name = document.createElement("name");
            Node alice = document.createTextNode("alice");
            name.appendChild(alice);
            student.appendChild(name);
            
            Element gender = document.createElement("gender");
            Node female = document.createTextNode("female");
            gender.appendChild(female);
            student.appendChild(gender);
            
            Element email = document.createElement("email");
            Node emailNode = document.createTextNode("123@gmail.com");
            email.appendChild(emailNode);
            student.appendChild(email);
            root.appendChild(student);
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            DOMSource source = 
new DOMSource(document);
            transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            StreamResult result = 
new StreamResult(
new FileOutputStream(
                    fileName));
            transformer.transform(source, result);
        } 
catch (Exception e) {
            
//
 TODO: handle exception
            e.printStackTrace();
        }
    }
    
public 
static 
void parseXml() {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        
try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse("src/book.xml");
            Element root = document.getDocumentElement(); 
//
 get the root
                                                            
//
 element
            NodeList childNodes = root.getChildNodes();
            
for (
int i = 0; i < childNodes.getLength(); i++) {
                Node node = childNodes.item(i);
                
if ("书".equals(node.getNodeName())) {
                    
//
 System.out.println(node.getBaseURI());
                    NodeList childNodess = node.getChildNodes();
                    
for (
int j = 0; j < childNodess.getLength(); j++) {
                        Node nodei = childNodess.item(j);
                        System.out.println(nodei.getTextContent());
                        
//
 System.out.println(nodei.getNodeName() + "=" +
                        
//
 nodei.getNodeValue());
                    }
                }
            }
            
//
 System.out.println(root.getTagName());
            
//
 System.out.println(root.getNodeName());
        } 
catch (ParserConfigurationException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (SAXException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (IOException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
public 
static 
void main(String []args){
        
//
DomDemo.createXml("src/student.xml");
        DomDemo.parseXml();
    }

  2.使用SAX方式解析:

package com.xml.sax;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;
public 
class SaxDemo {
    
public 
static 
void main(String[] args) {
        
//
SaxDemo.createXml();
        SaxDemo.parseXml();
    }
    
public 
static 
void createXml() {
        SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory
                .newInstance();
        TransformerHandler handler;
        
try {
            handler = factory.newTransformerHandler();
            Transformer transformer = handler.getTransformer();
            transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            FileOutputStream out = 
new FileOutputStream("src/computers.xml");
            Result result = 
new StreamResult(out);
            handler.setResult(result);
            
            handler.startDocument();
            AttributesImpl attr = 
new AttributesImpl();
            handler.startElement("", "", "computers", attr);
            attr.clear();
            attr.addAttribute("", "name", "name", "", "dell");
            attr.addAttribute("", "country", "country", "", "US");
            handler.startElement("", "", "dell", attr);
            handler.characters("dell's computer is  cheap!".toCharArray(), 0,
                    "dell's computer is cheap!".length());
            handler.endElement("", "", "dell");
            attr.clear();
            attr.addAttribute("", "name", "name", "", "levono");
            attr.addAttribute("", "country", "country", "", "CN");
            handler.startElement("", "", "lenovo", attr);
            handler.characters("lenovo's computer is good!".toCharArray(), 0,
                    "lenovo's computer is good!".length());
            handler.endElement("", "", "lenovo");
            
            handler.endElement("", "", "computers");
            handler.endDocument();
        } 
catch (TransformerConfigurationException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (FileNotFoundException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (SAXException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
public 
static 
void parseXml() {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser sp;
        
try {
            sp = factory.newSAXParser();
            XMLReader reader = sp.getXMLReader();
            reader.setContentHandler(
new MySaxHandler());
            reader.parse("src/book.xml");
            
//
 sp.parse(new File("src/book.xml"), new MySaxHandler());
        } 
catch (ParserConfigurationException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (SAXException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (IOException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
class MySaxHandler 
extends DefaultHandler {
    
public 
void characters(
char[] ch, 
int start, 
int length)
            
throws SAXException {
        
//
 TODO Auto-generated method stub
        System.out.println(
new String(ch, start, length));
    }
    
public 
void endElement(String uri, String localName, String qName)
            
throws SAXException {
        
//
 TODO Auto-generated method stub
        System.out.println("</" + qName + ">");
    }
    
public 
void startElement(String uri, String localName, String qName,
            Attributes attributes) 
throws SAXException {
        
//
 TODO Auto-generated method stub
        System.out.println("<" + qName + ">");
        
for (
int i = 0; attributes != 
null && i < attributes.getLength(); i++) {
            String attName = attributes.getQName(i);
            String attValue = attributes.getValue(i);
            System.out.println(attName + "=" + attValue);
        }
    }

}

3.使用Dom4j方式解析:

package com.xml.dom4j;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
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;
public 
class Dom4jDemo {
    
public 
static 
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("jobs"    );
        Element age = employee.addElement("age");
        age.setText("24");
        Element employee1 = employees.addElement("employee");
        Element name1 = employee1.addElement("name");
        name1.setText("steven");
        Element age1 = employee1.addElement("age");
        age1.setText("39");
        
try {
            Writer fileWriter = 
new FileWriter(fileName);
            XMLWriter xmlWriter = 
new XMLWriter(fileWriter);
            xmlWriter.write(document);
            xmlWriter.close();
        } 
catch (Exception e) {
            
//
 TODO: handle exception
            e.printStackTrace();
        }
    }
    
public 
static 
void parseXml() {
        SAXReader reader = 
new SAXReader();
        
try {
            Document document = reader.read(
new File("src/book.xml"));
            
//
 Document document = DocumentHelper.parseText()
            Element root = document.getRootElement();
        
//
    System.out.println(root.getName());
            Iterator it = root.elementIterator();
            
while (it.hasNext()) {
                Element e = (Element) it.next();
                
for(Iterator i=e.elementIterator(); i.hasNext();){
                    Element node = (Element) i.next();
                    System.out.println(node.getText());
                }
            }
            System.out.println("the file ends!");
        } 
catch (DocumentException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
public 
static 
void main(String[] args) {
        
//
Dom4jDemo.createXml("src/employee.xml");
        Dom4jDemo.parseXml();
        
    }

4.使用Jdom方式解析:

 View Code

 
package com.xml.jdom;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public 
class JdomDemo {
    
public 
static 
void createXml() {
        
try {
            Element root = 
new Element("authors");
            Document document = 
new Document(root);
            Element author1 = 
new Element("author");
            Element name1 = 
new Element("name");
            name1.setText("turing");
            Element contribution1 = 
new Element("contribution");
            contribution1.setText("Turing Machine");
            Element author2 = 
new Element("author");
            Element name2 = 
new Element("name");
            name2.setText("Von Neumann");
            Element contribution2 = 
new Element("contribution");
            contribution2.setText("ENIAC");
            author1.addContent(name1);
            author1.addContent(contribution1);
            author2.addContent(name2);
            author2.addContent(contribution2);
            root.addContent(author1);
            root.addContent(author2);
            document.setRootElement(root);
            XMLOutputter out = 
new XMLOutputter();
            out.output(document, 
new FileOutputStream("src/authors.xml"));
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }
    
public 
static 
void parseXml() {
        SAXBuilder builder = 
new SAXBuilder();
        
try {
            Document document = builder.build(
new File("src/book.xml"));
            Element root = document.getRootElement();
            List<Element> list = root.getChildren();
            
for (Element element : list) {
                System.out.println("<书名>" + element.getChildText("书名")
                        + "<书名/>");
                System.out.println("<作者>" + element.getChildText("作者")
                        + "<作者/>");
                System.out.println("<售价>" + element.getChildText("售价")
                        + "<售价/>");
            }
        } 
catch (JDOMException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (IOException e) {
            
//
 TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
public 
static 
void main(String[] args) {
        
//
JdomDemo.createXml();
        JdomDemo.parseXml();
    }

转载于:https://www.cnblogs.com/kingcucumber/archive/2012/12/27/2834166.html

你可能感兴趣的文章
企业级应用与互联网应用的区别
查看>>
itext jsp页面打印
查看>>
Perl正则表达式匹配
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
网站搭建(一)
查看>>
Spring JDBCTemplate
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
面试时被问到的问题
查看>>
spring 事务管理
查看>>
VS2008 去掉msvcr90的依赖
查看>>
当前记录已被另一个用户锁定
查看>>
Node.js 连接 MySQL
查看>>