xml文件的解析过程详解

XML项目工程展示图如下图:

student.xml 文件展示:
<?xml version="1.0" encoding="utf-8" ?> <person> <student id='1'> <name>余超</name> <sex>男</sex> <desc>一个执着而又天真的孩子</desc> </student> <student id='2'> <name>马靖</name> <sex>女</sex> <desc>一个特别难追求的女孩子</desc> </student> </person> Student实体类的展示:其作用就是用于临时保存xml文件中的数据到属性中 package net.nyist.xmlparse.domain; import java.io.Serializable; /** * @author yuchao * * @school 南阳理工软件学院移动设备应用与开发移动四班 * * @email yu0312chao@163.com * * @time 2014年9月30日 下午10:52:47 */ @SuppressWarnings("serial") public class Student implements Serializable { private int id; private String name; private String sex; private String desc; public Student() { } public Student(int id, String name, String sex, String desc) { this.id = id; this.name = name; this.sex = sex; this.desc = desc; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", desc=" + desc + "]"; } }

方法一:通过DOM来解析XML文件


  package net.nyist.xmlparse.parse.dom

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import net.nyist.xmlparse.domain.Student;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * @author yuchao
 * 
 * @school 南阳理工软件学院移动设备应用与开发移动四班
 * 
 * @email yu0312chao@163.com
 * 
 * @time 2014年9月30日 下午11:12:57
 */

public class DocumentBuilderFactoryDemo {

    public static void main(String[] args) {

long start = System.currentTimeMillis();
/** 首先得到:得到 DOM 解析器的工厂实例 */ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); List<Student> students = new ArrayList<Student>(); try { /** 然后从 DOM 工厂获得 DOM 解析器 */ DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); InputStream is = DocumentBuilderFactoryDemo.class.getClassLoader() .getResourceAsStream("student.xml"); Document document = documentBuilder.parse(is); /** 得到 XML 文档的根节点 */ Element element = document.getDocumentElement(); NodeList nodeList = element.getElementsByTagName("student"); Student student = null; for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); int id = Integer.parseInt(node.getAttributes() .getNamedItem("id").getNodeValue()); String nameValue = ""; String sexValue = ""; String descValue = ""; if (node.hasChildNodes()) { NodeList childNodes = node.getChildNodes(); for (int j = 0; j < childNodes.getLength(); j++) { Node node2 = childNodes.item(j); if ("name".equals(node2.getNodeName())) { nameValue = node2.getFirstChild().getTextContent(); } else if ("sex".equals(node2.getNodeName())) { sexValue = node2.getFirstChild().getTextContent(); } else if ("desc".equals(node2.getNodeName())) { descValue = node2.getFirstChild().getTextContent(); } } student = new Student(id, nameValue, sexValue, descValue); students.add(student); } } } catch (Exception e) { e.printStackTrace(); } for (int i = 0; students != null && students.size() > 0 && i < students.size(); i++) { System.out.println(students.get(i)); }
System.out.println("共用时:"+(System.currentTimeMillis()-start)); } }

方法二:用SAX解析XML文件

package net.nyist.xmlparse.parse.sax;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import net.nyist.xmlparse.domain.Student;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * @author yuchao
 * 
 * @school 南阳理工软件学院移动设备应用与开发移动四班
 * 
 * @email yu0312chao@163.com
 * 
 * @time 2014年10月1日 下午6:38:52
 * 
 * @deprecated 本类是用来对于XML文本的解析类
 */

public class PersonHandle extends DefaultHandler {

    private Student student;
    private List<Student> students;
    /**对于这个属性的使用主要作用是为了用来存放标签的名称,由此而获得这个标签下的文本内容的值*/
    private String tagName;

    public List<Student> getStudents() {
        return students;
    }

    public InputSource resolveEntity(String publicId, String systemId)
            throws IOException, SAXException {
        return null;
    }

    public void setDocumentLocator(Locator locator) {
        System.out.println("加载器开始处理xml文档........");
    }

    public void startDocument() throws SAXException {
        System.out.println("文档开始加载.........");
        students = new ArrayList<Student>();
    }

    public void endDocument() throws SAXException {
        System.out.println("xml文档处理结束.........");
    }

    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        tagName = qName;
        if ("student".equals(qName)) {
            student = new Student();
            int id = Integer.parseInt(attributes.getValue("id"));
            student.setId(id);
        }
    }
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        
        if ("student".equals(qName)) {
            students.add(student);
        }
        /**将其值变为null的主要目的是为了防止再次遍历的时候保存了结尾标签,这样会有空值的存在*/
        tagName = null;
    }

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

        if (!"".equals(tagName) && tagName != null) {

            if ("name".equals(tagName)) {

                student.setName(new String(ch, start, length));

            } else if ("sex".equals(tagName)) {

                student.setSex(new String(ch, start, length));

            } else if ("desc".equals(tagName)) {

                student.setDesc(new String(ch, start, length));
            }
        }
    }
    public static void main(String[] args) {
        PersonHandle personHandle =new PersonHandle();
        System.out.println(personHandle.getStudents());
    }
}


package net.nyist.xmlparse.parse.sax;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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

import net.nyist.xmlparse.domain.Student;

import org.xml.sax.SAXException;

/**
 * @author yuchao
 * 
 * @school 南阳理工软件学院移动设备应用与开发移动四班
 * 
 * @email yu0312chao@163.com
 * 
 * @time 2014年10月1日 下午6:30:51
 */

public class SaxFacroryParseDemo {

    public static void main(String[] args) {
         
        long start =System.currentTimeMillis();
        /** 创建SAX解析器工厂对象*/
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        try {
            /** 使用解析器工厂创建解析器实例 */
            SAXParser saxParser = saxParserFactory.newSAXParser();
            /**加载资源文件*/
            InputStream is = SaxFacroryParseDemo.class.getClassLoader()
                    .getResourceAsStream("student.xml");
            /**
             * 如果采用SAX方式来对于XML文件的处理的时候必须要使用xml文件的处理类:
             * 对于本例我使用默认的处理类PersonHandle,此类必须要继承 DefaultHandler 这个类,然后重载这个类的方法,以至于对于xml文档的处理
             * 
             * */
            PersonHandle personHandle = new PersonHandle();
            saxParser.parse(is, personHandle);
            List<Student> students = personHandle.getStudents();
            System.out.println("打印文档的内容:");
            for (int i = 0; students != null && i < students.size(); i++)
                System.out.println(students.get(i));
            System.out.println("共用时:"+(System.currentTimeMillis()-start));
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

 方法三:jdom解析XML文件:需要引入jdom.jar包

package net.nyist.xmlparse.parse.jdom;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import net.nyist.xmlparse.domain.Student;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

/**
 * @author yuchao
 * 
 * @school 南阳理工软件学院移动设备应用与开发移动四班
 * 
 * @email yu0312chao@163.com
 * 
 * @time 2014年10月1日 下午9:08:47
 */

public class SAXBuilderDemo {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        SAXBuilder saxBuilder = new SAXBuilder();
        /**加载资源文件*/
        InputStream in = SAXBuilderDemo.class.getClassLoader()
                .getResourceAsStream("student.xml");
        try {
            Document document = saxBuilder.build(in);
            Element element = document.getRootElement();
            List<Element> list = element.getChildren();
            if (list != null && list.size() > 0) {
                List<Student> students = new ArrayList<Student>();
                for (int i = 0; i < list.size(); i++) {
                    Element studentElement = list.get(i);
                    int id = studentElement.getAttribute("id").getIntValue();
                    String nameValue = studentElement.getChild("name")
                            .getText();
                    String sexValue = studentElement.getChild("sex").getText();
                    String descValue = studentElement.getChild("desc")
                            .getText();
                    Student student = new Student(id, nameValue, sexValue,
                            descValue);
                    students.add(student);
                }
                for (int i = 0; students != null && i < students.size(); i++)
                    System.out.println(students.get(i));
                System.out.println("共用时:"
                        + (System.currentTimeMillis() - start));
            }
        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
    }
}

 方法四:通过dom4j解析XML文件:引入两个包dom4j.jar 与jaxen.jar

package net.nyist.xmlparse.parse.dom4j;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import net.nyist.xmlparse.domain.Student;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * @author yuchao
 *
 * @school 南阳理工软件学院移动设备应用与开发移动四班
 *
 * @email yu0312chao@163.com
 *
 * @time  2014年10月1日 下午9:45:12
 */

public class SAXReaderDemo {
  
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        
        long start = System.currentTimeMillis();
        SAXReader saxReader =new SAXReader();
        InputStream in =SAXReaderDemo.class.getClassLoader().getResourceAsStream("student.xml");
        try {
            Document document = saxReader.read(in);
            Element element = document.getRootElement();
            List<Element> rootElements = element.elements();
            List<Student> students =new ArrayList<Student>();
            Student student =null;
            for (int i = 0;rootElements!=null && i < rootElements.size(); i++) {
                Element childElement =  rootElements.get(i);
                int id =Integer.parseInt(childElement.attribute("id").getText());
                String nameValue =childElement.elementText("name");
                String sexValue =childElement.elementText("sex");
                String descValue =childElement.elementText("desc");
                student =new Student(id, nameValue, sexValue, descValue);
                students.add(student);
            }
            for (int i = 0; students != null && i < students.size(); i++)
                System.out.println(students.get(i));
            System.out.println("共用时:"
                    + (System.currentTimeMillis() - start));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
         
    }
}

 

posted @ 2014-10-01 01:24  yu0312chao  阅读(5192)  评论(0编辑  收藏  举报