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]









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
使用Pull解析器生成XML文件的一般步骤如下: 1. 创建一个XmlSerializer对象,该对象将用于序列化XML数据。 2. 使用XmlSerializer对象创建一个XmlWriter对象,该对象将用于将XML数据写入文件。 3. 使用XmlWriter对象的WriteStartDocument方法写入XML文件的开头。 4. 使用XmlWriter对象的WriteStartElement方法写入根元素的开始标记。 5. 使用XmlWriter对象的WriteElementString方法写入子元素的标记和值。 6. 使用XmlWriter对象的WriteEndElement方法写入根元素的结束标记。 7. 使用XmlWriter对象的WriteEndDocument方法写入XML文件的结尾。 8. 关闭XmlWriter对象。 下面是一个使用Pull解析器生成XML文件的示例代码: ``` java import java.io.FileWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; public class XmlGenerator { public static void main(String[] args) { try { // 创建一个XMLOutputFactory对象 XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); // 创建一个XMLStreamWriter对象 XMLStreamWriter writer = outputFactory .createXMLStreamWriter(new FileWriter("output.xml")); // 写入XML文件的开头 writer.writeStartDocument(); // 写入根元素的开始标记 writer.writeStartElement("root"); // 写入子元素的标记和值 writer.writeStartElement("child"); writer.writeCharacters("Hello World!"); writer.writeEndElement(); // 写入根元素的结束标记 writer.writeEndElement(); // 写入XML文件的结尾 writer.writeEndDocument(); // 关闭XMLStreamWriter对象 writer.close(); System.out.println("XML文件已生成!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 执行该代码后,将在项目根目录下生成名为"output.xml"的XML文件,其内容如下: ``` xml <?xml version="1.0" ?> <root> <child>Hello World!</child> </root> ``` 注意:上述示例代码中使用的是Java语言的StAX API,而不是Pull解析器。不过,StAX API提供了一种类Pull解析器的编程模型,可以方便地生成XML文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值