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

javaXML文件解析(一) SAX解析

2016-12-14 15:11 393 查看
当我们与互联网交互时我们需要解析从网络上访问到的资源,例如XML文件,本例将详细介绍关于XML文件解析最常用的几种方法

SAX解析

当读取到文档(Document)开始,结束,元素(Element)开始结束时,调用相应的时事件处理函数,然后继续同样的操作,解析速度快,占用内存少,以流的方式解析,速度快,但是没遇到一类的xml文档就需要新的适合的XML文档解析类

SAX解析xml数据是以事件驱动的,不需要解析整个文档,在处理过程中判断读到的字符是否符合一定的规则,调用相应的回调方法

步骤1.继承DefaultHandler类,重写必要的方法

public class MyHandler extends DefaultHandler {
private LinkedHashMap<String, String> map = null;//存储单个解析出来的完整对象
private List<LinkedHashMap<String,String>> list = null;//存储解析出来的所有对象
private String currentTag = null;//正在解析元素的标签
private String currentValue = null;//解析当前元素的值
private String nodeName = null;//解析当前节点的名称
public MyHandler(String nodeName) {
this.nodeName = nodeName;
}
public List<LinkedHashMap<String, String>> getList() {
return list;
}

//解析文档开始时调用,用来完成一些初始化工作
@Override
public void startDocument() throws SAXException {
System.out.println("xml文档解析开始");
list = new ArrayList<LinkedHashMap<String,String>>();

}
//每遇到一个开始标签时,便触发
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(nodeName.equals(qName)){
map = new LinkedHashMap<String,String>();
}
//解析标签属性的名字和值加入到map当中去
if(attributes!= null&&map!=null){
for(int i = 0;i<attributes.getLength();i++){
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
currentTag = qName;
System.out.println(currentTag);
}
//用来处理xml文件读取到的内容,读取标签后面的内容,
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(start+"  "+length);
// TODO Auto-generated method stub
if(currentTag!=null&&map!=null){
currentValue = new String(ch, start, length);
if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){
map.put(currentTag, currentValue);
}
}
currentTag = null;
currentValue = null;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
System.out.println(qName);
if(qName==nodeName){
list.add(map);
map = null;;
}
}
}


//解析xml文档
public class SAXService {

public static List<LinkedHashMap<String, String>> readXML(InputStream is,String nodeName) throws ParserConfigurationException, SAXException, IOException{
List<LinkedHashMap<String, String>> list = null;
//创建一个SAX解析工厂
SAXParserFactory sap = SAXParserFactory.newInstance();
//得到一个SAX解析器
SAXParser parser = sap.newSAXParser();
//创建一个xml文件解析类
MyHandler handler = new MyHandler(nodeName);
//以流的方式解析xml文档 体现了SAX解析xml的流解析特点
parser.parse(is, handler);
is.close();
return handler.getList();
}
}


访问服务器上的xml文档,并以流的方式返回

public class HttpUtils {
public static InputStream getXML(String path) throws IOException{
InputStream inputStream = null;

URL url = new URL(path);

if(url!=null){

HttpURLConnection httpURLConnection =   (HttpURLConnection) url.openConnection();
//设置连接超时
httpURLConnection.setConnectTimeout(3000);
//设置是否能获得输入流
httpURLConnection.setDoInput(true);
//设置请求方式
httpURLConnection.setRequestMethod("GET");
//获取响应码
int code = httpURLConnection.getResponseCode();

inputStream = httpURLConnection.getInputStream();

}

return inputStream;
}
}


//最后在一个测试类中调用 path路径读者写自己的就ok了

public class test {

public static void main(String[] args) throws ParserConfigurationException, SAXException {

String path = “http://..888:8080/SAX_Xml/person.xml”;

try {

InputStream inputStream = HttpUtils.getXML(path);

String person = “person”;

List

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id = "1">
<name>java</name>
<age>15</age>
</person>
<person id = "2">
<name>C#</name>
<age>14</age>
</person>
</persons>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: