Pull解析器解析XML

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

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]

猜你在找的XML相关文章