您的位置:首页 > 其它

Pull解析器解析XML

2015-08-12 13:58 288 查看
 Pull解析器解析XML      

     除了可以使用SAX或DOM解析XML文件之外,也可以使用Pull解析器解析XML文件。 Pull解析器是一个开源的

java项目,既可以用于android,Android已经内置了,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入

类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml

文件,其内部也是采用Pull解析器进行解析的。
Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,

如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是,
Pull解

析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调

用parser.nextText()方法可以获取下一个Text类型节点的值。

现在看看是怎么具体进行解析的!,现在我们要解析服务器端的一个xml文件-----person.xml。person.xml的代码

结构如下:

<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name  id="1">wangjing</name>
<age>18</age>
</person>
<person>
<name  id="2">zahnsan</name>
<age>19</age>
</person>
<person>
<name  id="3">lisi</name>
<age>20</age>
</person>
</persons></span>


现在定义一个HttpUtils用来获取服务器端的person.xml文件的输入流

public class HttpUtils {

public static  InputStream  getInputStream(String path) throws IOException{
URL  url=new URL(path);
HttpURLConnection  coon=(HttpURLConnection) url.openConnection();

coon.setReadTimeout(50000);

coon.setRequestMethod("POST");

if(	coon.getResponseCode()==200){
return coon.getInputStream();
}
return null;
}
}


对于person.xml解析的结果,我们用一个Person实体类进行封装起来

public class Person {

private String name;
private String age;
private String id;

public Person(String name, String age, String id) {
super();
this.name = name;
this.age = age;
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
public Person() {
super();
}

@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", id=" + id + "]";
}
}


好啦,开始定义解析器类了。。。。返回结果是一个List<Person>.

public class PullParse {

public List<Person> pullPersonXml(String path) throws Exception {

List<Person> list = null;
Person person = null;

// 创建工厂类对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 创建解析器对象
XmlPullParser parser = factory.newPullParser();

InputStream stream = HttpUtils.getInputStream(path);

BufferedReader bis = new BufferedReader(new InputStreamReader(stream,"UTF-8"));
// 把被解析的文件的读取流给解析器
parser.setInput(bis);
// 解析器在解析过程中会返回编号0,2,4,3,1

int eventType = parser.getEventType();

while (eventType != XmlPullParser.END_DOCUMENT) {

switch (eventType) {

case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
// 得到标签名称
String tagName = parser.getName();

if ("person".equals(tagName)) {
person = new Person();

} else if ("name".equals(tagName)) {
//属性可能不止一个,所以我们先获取个数
int count = parser.getAttributeCount();
for (int i = 0; i <count; i++) {
//获取属性名
String attrName=parser.getAttributeName(i);
//获取属性值
String attrValue=parser.getAttributeValue(i);
if("id".equals(attrName)){
person.setId(attrValue);
}
}
person.setName(parser.nextText());// 直接得到标签后面的数据

} else if ("age".equals(tagName)) {
person.setAge(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
// 得到标签名称
tagName = parser.getName();
if ("person".equals(tagName)) {
list.add(person);
}
break;
case XmlPullParser.END_DOCUMENT:
break;
default:
break;
}
// 继续下一个编号
eventType = parser.next();
}
return list;
}
}


测试类:

public class TestPullPerson {

public static void main(String[] args) throws Exception {

String path="http://wangjing-pc:8080/Day16/person.xml";

PullParse  pp=new PullParse();

List<Person> list = pp.pullPersonXml(path);

for (Person person : list) {
System.out.println(person);
}
}
}


解析结果:

Person [name=wangjing, age=18, id=1]

Person [name=zahnsan, age=19, id=2]

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