您的位置:首页 > 理论基础 > 计算机网络

java网络编程之SAX,Pull,DOM,对服务器下XML文件的解析之SAX篇

2013-08-24 01:22 232 查看

这几天一直在研究java网络编程的一些问题,在一些论坛上看到这样一个知识点,就是对服务器端的xml文件的解析。刚开始的时候还是有点困惑的,后

来就慢慢的想通了,下面就让我具体的讲解一下吧。

既然讲到java的网络编程,就必须讲一下java中如何通过http协议获取服务端的信息。在所有的通过http协议向服务器发出请求获取资源的方有两种

POST和GET方式,具体两种方式的不同以及有关http协议此处不再解释。接下来我们详细讲解一下如何通过java的http编程获取服务器端的资源。

在java中我们可以找到这样一个类 URL,类 URL代表一个统一资源定位符,它是指向互联网“资源”的指针,资源可以是简单的文件或目录,也可以是

对更为复杂的对象的引用,具体的方法可以看URL的构造方法,在这里我们用最为简单的:

String Path = "";
URL url = new URL(Path ) ;

 Path是一个文档的具体地址,在下面就是一个XML文件的具体地址

这样我们就可以获取了一个URL对象,接下来我们可以通过URL中的openConnection() 方法获取一个到URl所引用的远程对象的链接,代码如下:

if(url!=null){
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
}

 

接下来我们要设置请求数据的方式以及请求的响应时间,代码如下:

httpURLConnection.setRequestMethod("GET");
httpURLConnection.setReadTimeout(3000);

 应为我们是要从服务器段获取数据,所以我们要获取输入流,这样就能读取服务端的数据,在这之前,我们要使用这个方法:

httpURLConnection.setDoInput(true);

 所有的准备工作做好了,现在我们要获取输入流了,在这个时候我们要先判断一下服务器端 返回的状态码,200表示正常,代码如下:

if(httpURLConnection.getResponseCode()==200){

inputStream = httpURLConnection.getInputStream();
}

 

这样我们就可以从服务器端获取到了输入流了,接下来只要将输入流写到输出流就行了,此处不再赘述。下面让我们进入正题,对XML文档的解析。

先看这样的一个XML文件:

<Persons>
<Person id=12>
<name>田佳伟</name>
<age>22</age>
</Person>
<Person id=13>
<name>戴洪涛</name>
<age>24</age>
</Person>
</Persons>

 接下来我们就通过分别通过SAX ,Pull,DOM技术对它进行解析。
先说明一下这三中技术的差别,SAX技术不需要知道所要解析的文档标签,直接进行解析,而其他两种就需要知道文档标签才可以。先让我们看一下SAX

技术对XML文件的解析,

在java中有这样的一个类DefaultHandler,我们可以使用这个类对XML文档进行SAX技术的解析

在类DefaultHandler中有这样几个方法:

//接受文档是自动调用
startDocument() ;

// 接收元素开始的通知,自动调用
startElement(String uri, String localName, String qName, Attributes attributes) ;

//接收元素中字符数据的通知。
characters(char[] ch, int start, int length) ;
//接收元素结束的通知。
endElement(String uri, String localName, String qName);

 


下面通过具体代码解释一下如何使用DefaultHandler类

首先我们要定义这样几个属性:

//定义一个hashmap,用于装对应的键值和键名
private HashMap<String , String > map = null;
//定义一个装map的list
private List<HashMap<String , String >>list = null;
//定义当前的标签的名称
private String CurrentTag;
//定义当前的标签的内容
private String CurrentValue;
//定义节点的名称
private String nodeName;

 


然后就要调用startDocument()方法了,在定义这个方法时我们要实例化list.代码如下:

@Override
public void startDocument() throws SAXException {
//开始读取时创建list
list = new ArrayList<HashMap<String,String>>();

}

 
然后就是调用startElement(String uri, String localName, String qName, Attributes attributes) 方法,就相当于读到上面XML文件的

Person节点时,这个时候要先判断一下节点,然后实例化map,在判断其是否有值:如id,同时这个时候要给CurrentTag赋值了具体代码如下:

@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals(nodeName)){

map = new HashMap<String, String>();

}

if(map!=null&&attributes!=null){

for(int i=0;i<attributes.getLength();i++){

map.put(attributes.getQName(i), attributes.getValue(i));
}
}
CurrentTag = qName;
}

 然后就要读到具体的内容了,调用这个方法characters(char[] ch, int start, int length) ;具体代码如下:

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(CurrentTag!=null&&map!=null){
CurrentValue = new String(ch,start,length);

}
if(CurrentValue!=null&&!CurrentValue.equals("")){
map.put(CurrentTag, CurrentValue);
}

CurrentTag = null;
CurrentValue = null;
}

 
这个方法会读完所有的数据,这样就会读到尾节点了,于是就要调用这个方法了:
endElement(String uri, String localName, String qName);
那么,我们就应该把map添加到list中,同时初始化一下map,具体代码如下:

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals(nodeName)){
list.add(map);
map=null;
}
}

  在上面我们要通过构造函数传一个节点过去。

这样我们就将xml的文件解析了,然后就要用到saxparser对xml进行解析了,先从saxParser工厂中获取saxparser,然后再进行解析:

具体代码如下:

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();

 接下来调用这个方法进行解析

saxParser.parse(InputStream, DefaultHandle);

 

以上第一个参数是我们在之前讲过的获取的输入流,后面的参数是刚刚讲过的实例化的对象。
这样就可义解析服务器端的xml文件。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: