您的位置:首页 > 编程语言 > Java开发

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

2016-04-11 23:07 477 查看
对于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!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml 文档 结构 java