论Java加载和解析XML文件的两种方法

对于Java来说,加载和解析XML文件有两种方法:

一种:通过加载整个XML文件生成Document文档,然后解析Document文档内容的树和根。

另一种:利用SAX封装类来逐步解析。

这两种方法各有优点和缺点:第一种由于需要加载整个XML文件生成Document,在解析,所以假如XML文件内容过多、过大,就会造成加载延迟,缓慢(所以此方法只适用于XML文件比较小点 的XML文件);而第二种方法利用SAX封装类来加载XML文件,实现边加载边解析,不用等到全部的XML内容加载完成,所以无需担心XML文件过大、内容过多等问题,但由于消耗的系统资源比第一种要多。所以说各有利弊。总的一句话说,XML文件小的话,就使用第一种方法,假如文件过大,就是用第二种。

在开始前先来看看整个项目的结构


其中,Gamers.xml就是我们要解析的xml文件,再来看一下xml内的内容

<?xml version="1.0" encoding="UTF-8"?>
<Gamers>
    <Gamer>
        <ID>TOR_Apple</ID>
        <Grade>13</Grade>
    </Gamer>
    <Gamer>
        <ID>TOR_zhuang</ID>
        <Grade>16</Grade>
    </Gamer>
    <Gamer>
        <ID>TOR_KongBai</ID>
        <Grade>13</Grade>
    </Gamer>
    <Gamer>
        <ID>TOR_OMG</ID>
        <Grade>16</Grade>
    </Gamer>
</Gamers>

xml文件结构:树<Gamer>,根<Gamer>和每个根内的元素<ID>、<Grade>(我是个魔兽迷~~)。

好了,先来看看第一种方法:生成Document方式解析XML文件

package com.parsers;

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlParsers {
	//采用DOM解析形式
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//导入xml文件,要注意xml文件的路径要正确
		File file=new File("xmlfields/Gamers.xml");
		/*实例化一个DocumentBuildFactory,一个document构造器构建的工厂,
		顾名思义,我想大家都能猜到它的作用了吧。*/
		DocumentBuilderFactory dbf=
				DocumentBuilderFactory.newInstance();
		DocumentBuilder db;
		try {
			//实例化一个DocumentBuilder,一个document构造器,用于生成Document文档
			db=dbf.newDocumentBuilder();
			//通过构造器的parse()方法,将一个File对象生成相应的Document文档
			Document document=db.parse(file);
			/*根据字符串在document内查找相应的根,其返回值是一个节点链表,
			至于链表不懂的话,大家可以去看一下数据结构*/
			NodeList nodeList=document.getElementsByTagName("Gamer");
			for(int j=0;j<nodeList.getLength();j++){
				//返回相应根内的子节点,其返回值也是个节点链表
				NodeList childList=nodeList.item(j).getChildNodes();
				for(int i=0;i<childList.getLength();i++){
					//获取相应的根内的元素的名字
					String tagName=childList.item(i).getNodeName();
					if(tagName.equals("ID")){
						/*
						 * 这里要注意一下,假如我想获取ID标签下的值(假如是TOR_Apple),很多人都这样写
						 * childList.item(i).getNodeValue(),但这样是错了,不会等到相应的结果,由于childList.item(i)
						 * 这句代码的得到的只是<ID>,而TOR_Apple这个值不是<ID>的值,而是<ID>的子节点。切记*/
						System.out.print(childList.item(i).getChildNodes().item(0).getNodeValue()+"==");
					}else if(tagName.equals("Grade")){
						System.out.println(childList.item(i).getChildNodes().item(0).getNodeValue());
					}
				}
			}
		} 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();
		}
	}

}

好了,代码中有注释,相信大家一定会看的很明白的。第一种解析XML文件的方法就介绍到这。接下来,就是第二种解析XML文件的方法咯,废话不多说,上代码

package com.parsers;

import java.io.IOException;

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

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

public class XmlParsersUserSAX extends DefaultHandler{

	/**
	 * @param args
	 */
	String tagName=null;
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		// TODO Auto-generated method stub
		XmlParsersUserSAX spus=new XmlParsersUserSAX();
		//实例化一个SAX解析工厂
		SAXParserFactory spf=SAXParserFactory.newInstance();
		//通过工厂生成一个SAX解析器SAXParser
		SAXParser saxParser=spf.newSAXParser();
		//解析xml文件
		saxParser.parse(new InputSource("xmlfields/Gamers.xml"), spus);
	}

	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		//系统自动调用,当开始解析xml文件时(遇到树节点),就会被自动调用
		System.out.println("准备开始解析对象....");
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		//系统自动调用,当结束解析xml文件时(遇到树结束节点),就会被自动调用
		System.out.println("对象解析结束....");
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		//系统自动调用
		if(qName.equals("ID") || qName.equals("Grade")){
			System.out.println("开始解析元素...");
			tagName=qName.trim();
			System.out.println(tagName);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		//系统自动调用
		System.out.println("元素解析完毕...");
		tagName=null;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		//系统自动调用
		if(tagName!=null){
			if(tagName.equals("ID")){
				System.out.print(tagName+":"+new String(ch,start,length)+"==");
			}else if(tagName.equals("Grade")){
				System.out.println(tagName+":"+new String(ch,start,length));
			}
		}
	}
}

好了,两种方法都讲完了~~呵呵呵呵,不知道对大家有木有用处,望哪位学友、大神飘过了留下宝贵的意见,thanks!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值