解析xml文件的四种方式(dom & dom4j & jdom & sax)

建议采用dom4j解析xml文件:

测试类:

package com.juchaosoft.test;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;

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

import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ParseXMLFileTest {

    // 解析xml的四种方式
    // https://blog.csdn.net/qq_38695182/article/details/79922262
    /**
     * dom 解析
     * 
     * @param filePath
     *            文件路径
     */
    public static void parseDom(String pathname) {
        System.out.println("----------------------dom 解析------------------------");
        File file = new File(pathname);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(file);
            NodeList nodeList = doc.getElementsByTagName("VALUE");
            for (int i = 0; i < nodeList.getLength(); i++) {
                System.out.println(doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()
                    + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * dom4j 解析
     * 
     * @param pathname
     *            文件路径
     */
    public static void parseDom4j(String pathname) {
        System.out.println("----------------------dom4j 解析------------------------");
        File file = new File(pathname);
        SAXReader reader = new SAXReader();
        org.dom4j.Document doc;
        try {
            doc = reader.read(file);
            Element root = doc.getRootElement();
            Iterator<?> it = root.elementIterator("VALUE");
            Element element;
            while (it.hasNext()) {
                element = (Element)it.next();
                System.out.println(element.elementText("NO") + element.elementText("ADDR"));
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * jdom 解析
     * 
     * @param pathname
     *            文件路径
     */
    public static void parseJdom(String pathname) {
        System.out.println("----------------------jdom 解析------------------------");
        File file = new File(pathname);
        SAXBuilder builder = new SAXBuilder();
        org.jdom2.Document doc;
        try {
            doc = builder.build(file);
            org.jdom2.Element root = doc.getRootElement();
            List<org.jdom2.Element> children = root.getChildren();
            for (org.jdom2.Element element : children) {
                System.out.println(element.getChildText("NO") + element.getChildText("ADDR"));
            }
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * sax 解析
     * 
     * @param pathname
     *            文件路径
     */
    public static void parseSax(String pathname) {
        System.out.println("----------------------sax 解析------------------------");
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            MySax reader = new MySax();
            parser.parse(new InputSource(pathname), reader);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String pathname = "src/test.xml";
        parseDom(pathname);
        parseDom4j(pathname);
        parseJdom(pathname);
        parseSax(pathname);
    }

}

class MySax extends DefaultHandler {
    @SuppressWarnings("rawtypes")
    Stack tags = new Stack();

    public MySax() {
        super();
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String tag = (String)tags.peek();
        System.out.println(("NO".equals(tag) ? new String(ch, start, length) : "")
            + ("ADDR".equals(tag) ? new String(ch, start, length) : ""));
    }

    @SuppressWarnings("unchecked")
    @Override
    public void startElement(java.lang.String uri, java.lang.String localName, java.lang.String qName,
        Attributes attributes) throws SAXException {
        tags.push(qName);
    }
}

xml文件:

<?xml version="1.0" encoding="GB2312"?>  
<RESULT>  
    <VALUE>     
       <NO>home</NO>     
       <ADDR>河南省濮阳市</ADDR>  
    </VALUE>  
    <VALUE>     
       <NO>work</NO>     
       <ADDR>广东省广州市</ADDR>  
    </VALUE>  
</RESULT>

引入jar包:

dom4j-1.6.1.jar,jdom-2.0.2.jar

猜你喜欢

转载自www.cnblogs.com/huakaiyoushi/p/11131834.html