Sax读取XML文件

前端之家收集整理的这篇文章主要介绍了Sax读取XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

ReadXmlUtil.java

packageorg.apache.list.util;

importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.util.HashMap;
importjava.util.List;

importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;

importorg.xml.sax.SAXException;
publicclassReadXmlUtil{
/**
*匹配文件
*/
privatestaticfinalStringFILE_TYPE="xml";

/**
*用Sax读取xml文件
*
*@paramfileName
*文件名
*@paramnodeName
*标示符
*@return
*读取的内容
*@throwsException
*/
publicstaticList<HashMap<String,String>>readXmlInfo(StringfileName,StringnodeName)
throwsException{

//文件为空的情况下
if(fileName==null||fileName.length()==0){
returnnull;
}

//不是XML文件的情况下
if(!fileName.endsWith(FILE_TYPE)){
returnnull;
}

//文件是否存在和文件夹判断
FilefileInfo=newFile(fileName);
if(!fileInfo.exists()){
returnnull;
}
if(fileInfo.isDirectory()){
returnnull;
}

//获得文件输入流
FileInputStreamfs=newFileInputStream(newFile(fileName));

try{
SAXParserFactoryspf=SAXParserFactory.newInstance();
SAXParserparser=spf.newSAXParser();
SaxHandlerhandler=newSaxHandler(nodeName);
parser.parse(fs,handler);
fs.close();
returnhandler.getList();
}catch(ParserConfigurationExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SAXExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}

publicstaticvoidmain(String[]args)throwsException{
try{
List<HashMap<String,String>>list=readXmlInfo("src/itcast.xml","person");
for(HashMap<String,String>p:list){
System.out.println(p.toString());
}
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}

SaxHandler.java

packageorg.apache.list.util;

importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;

importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;

publicclassSaxHandlerextendsDefaultHandler{
/**
*三级标签
*/
privateHashMap<String,String>map=null;
/**
*二级标签
*/
privateList<HashMap<String,String>>list=null;
/**
*正在解析的元素的标签
*/
privateStringcurrentTag=null;
/**
*正在解析的元素的值
*/
privateStringcurrentValue=null;

privateStringnodeName=null;

publicList<HashMap<String,String>>getList(){
returnlist;
}

publicSaxHandler(StringnodeName){
this.nodeName=nodeName;
}

/**
*当读到一个开始标签的时候,会触发这个方法
*/
publicvoidstartDocument()throwsSAXException{
list=newArrayList<HashMap<String,String>>();
}

/**
*当遇到文档的开头的时候,调用这个方法
*/
publicvoidstartElement(Stringuri,StringlocalName,Stringname,Attributesattributes)
throwsSAXException{
if(name.equals(nodeName)){
map=newHashMap<String,String>();
}
if(attributes!=null&&map!=null){
for(inti=0;i<attributes.getLength();i++){
map.put(attributes.getQName(i),attributes.getValue(i));
}
}
currentTag=name;
}

/**
*这个方法用来处理在XML文件中读到的内容
*/
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
if(currentTag!=null&&map!=null){
currentValue=newString(ch,start,length);
if(currentValue!=null&&!currentValue.trim().equals("")
&&!currentValue.trim().equals("\n")){
map.put(currentTag,currentValue);
}
}
currentTag=null;
currentValue=null;
}

/**
*在遇到结束标签的时候,调用这个方法
*/
publicvoidendElement(Stringuri,Stringname)throwsSAXException{
if(name.equals(nodeName)){
list.add(map);
map=null;
}
super.endElement(uri,localName,name);
}

}

itcast.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<persons>
<personid="23">
<name>zhangsan</name>
<age>30</age>
</person>
<personid="20">
<name>lisi</name>
<age>25</age>
</person>
</persons>

猜你在找的XML相关文章