Android使用Pull解析器解析XML文件

Pull简介

   1.常见的XML解析方式有三种,DOM、SAX、Pull,Android系统中推荐使用Pull

   2.Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目

   3.Android SDK中已经集成了Pull解析器,无需添加任何jar文件

   4.Pull解析器运行方式与SAX类似,提供各种事件的判断

   5.官方网站:http://xmlpull.org/

使用Pull解析器解析XML文件

  1.  Xml.newPullParser() 获得解析器

  2  parser.setInput(in, "UTF-8") 设置输入流以及编码

  3. parser.next() 获取下一个解析事件,得到一个事件代码

  4. XmlPullParser中定义了常量来标识各种解析事件

      START_DOCUMENT、END_DOCUMENT 、START_TAG 、END_TAG 、TEXT

示例:

	/**
	 * 接收一个XML文件输入流, 从输入流中读所有User节点, 将数据封装成对象装入List返回
	 * @param in XML文件的输入流
	 * @return User对象的集合
	 * @throws Exception 
	 */
	public List<User> findAll(InputStream in) throws Exception {
		// 获取Pull解析器
		XmlPullParser parser = Xml.newPullParser();
		// 解析器加载输入流
		parser.setInput(in, "UTF-8");

		List<User> list = new ArrayList<User>();
		User user = null;
		for (int event = parser.getEventType(); event != XmlPullParser.END_DOCUMENT; event = parser.next())
			switch (event) {
				case XmlPullParser.START_TAG:
					if ("user".equals(parser.getName())) {
						user = new User();
						String id = parser.getAttributeValue(0);
						user.setId(new Integer(id));
						list.add(user);
					} else if ("name".equals(parser.getName())) {
						String name = parser.nextText();
						user.setName(name);
					} else if ("age".equals(parser.getName())) {
						String age = parser.nextText();
						user.setAge(new Integer(age));
					}
			}

		return list;
	}

使用XmlSerializer写出XML

    使用以下方法生成XML,和XML文档顺序类似

startDocument

startTag

attribute

text

endTag

endDocument

	/**
	 * 使用XmlSerializer写出XML
	 * @param users User集合
	 * @param out 输出流
	 * @throws IOException
	 */
	public void saveAllByXmlSerializer(List<User> users, OutputStream out) throws IOException {
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(out, "UTF-8");

		serializer.startDocument("UTF-8", true);
		serializer.startTag(null, "users");

		for (User user : users) {
			serializer.startTag(null, "user");
			serializer.attribute(null, "id", user.getId().toString());

			serializer.startTag(null, "name");
			serializer.text(user.getName());
			serializer.endTag(null, "name");

			serializer.startTag(null, "age");
			serializer.text(user.getAge().toString());
			serializer.endTag(null, "age");

			serializer.endTag(null, "user");
		}

		serializer.endTag(null, "users");
		serializer.endDocument();
	}


用StringBuilder写出XML文件

以下是自己拼接的而成的,如果里边有特殊符号的话就不太好做

	/**
	 * 将若干User用XML形式描述, 输出到指定输出流
	 * @param users User集合
	 * @param out 输出流
	 * @throws IOException 
	 */
	public void saveAll(List<User> users, OutputStream out) throws IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		sb.append("<users>");
		for (User user : users) {
			sb.append("<user id=\"" + user.getId() + "\">");
			sb.append("<name>" + user.getName() + "</name>");
			sb.append("<age>" + user.getAge() + "</age>");
			sb.append("</user>");
		}
		sb.append("</users>");
		out.write(sb.toString().getBytes());
		out.close();
	}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅荣康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值