yu0312chao的gravatar头像
yu0312chao 2014-10-02 12:02:14

Java XML解析的四种方法总结

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

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实体类的展示:

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 解析器的工厂实例 */
      
            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 = "";

        } 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 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));
            }
        }
    }
}

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 {
		    
			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);
       
        } 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();
     
        try {
            Document document = saxReader.read(in);
          
            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();
        }
         
    }
}

运行结果:


最代码官方编辑于2014-10-2 14:42:25


打赏

文件名:xmlparse.zip,文件大小:631.604K 下载
最代码最近下载分享源代码列表最近下载
我是helloworld  LV19 6月2日
ycb159856  LV12 2017年4月11日
scpcyzxb  LV16 2017年3月5日
v512345  LV10 2016年2月14日
日久生情  LV19 2015年6月12日
jing427  LV18 2015年3月9日
zyb507  LV13 2015年1月22日
1037704496  LV1 2014年11月14日
softcore  LV10 2014年10月14日
lwptest  LV1 2014年10月12日
最代码最近浏览分享源代码列表最近浏览
我是helloworld  LV19 6月2日
chokkint  LV12 2021年10月27日
zhoujunyu  LV14 2021年4月13日
773977962  LV9 2021年3月30日
1234567891011  LV5 2020年7月3日
王二麻子滴滴 2020年6月14日
暂无贡献等级
和诗夜 2020年6月13日
暂无贡献等级
下载狂魔 2020年1月16日
暂无贡献等级
AKALilgirl 2019年12月8日
暂无贡献等级
0312wangchen  LV26 2019年10月31日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友