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文件
好了,代码中有注释,相信大家一定会看的很明白的。第一种解析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文件生成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!!!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序