Android中XML数据解析

一般情况下服务器端返回给客户端的数据主要包括三种类型,字符串,xml,json,因此需要解析成为可读数据。xml数据传输,现在已经用的比较少了,而json用的比较广泛。不过还有一些免费的接口还是会返回xml形式数据,因此学习xml解析还是有必要的!!!
这里写图片描述

1、概述

什么是XML?可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。特点,可读性强,传输效率低。
XML常用解析方式:

  • SAX解析
  • PULL解析
  • DOM解析

废话少说直接撸码…

2、SAX解析

使用SAX解析XML是用的比较多的,主要由以下几个步骤:

  • 得到SAXParserFactory对象
  • 得到xml读取对象
  • 设置内容处理器
  • 开始解析

XML数据:

<xml>
  <man>
    <name>一一</name>
    <age>11</age>
    <address>北京</address>
  </man>  
  <man>
    <name>二二</name>
    <age>22</age>
    <address>济南</address>
  </man>
</xml>

MainActivity.java

/**
 * Created by magic on 2015年2月23日.SAX解析
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_activity);

		try {

			String string = "<xml><man><name>一一</name><age>11</age><address>北京</address></man>"
					+ "<man><name>二二</name><age>22</age><address>济南</address></man></xml>";
			// 单例模式 得到
			SAXParserFactory factory = SAXParserFactory.newInstance();
			// 得到xml读取对象
			XMLReader xmlReader = factory.newSAXParser().getXMLReader();
			// 设置内容处理器
			xmlReader.setContentHandler(new MyContentHandler());
			// 解析
			xmlReader.parse(new InputSource(new StringReader(string)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

MyContentHandler.java内容处理器

/**
 * Created by magic on 2015年2月23日.自定义类 继承DefaultHandler类
 */
public class MyContentHandler extends DefaultHandler {
	String hisName, hisAge, hisAddress;
	String tagName;

	@Override
	public void startDocument() throws SAXException {
		// 开始解析
		System.out.println("-----------begin-------------");
	}

	// uri: 命名空间 localName:没有前缀的标签 qName:有前缀的标签 attributes:标签的属性
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		tagName = localName;
		if (tagName.equals("man")) {
			// 输出属性名和值
			for (int i = 0; i < attributes.getLength(); i++) {
				System.out.println(attributes.getLocalName(i) + ":"
						+ attributes.getValue(i));
			}
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// 解析数据实体并赋值
		if (tagName.equals("name"))
			hisName = new String(ch, start, length);
		else if (tagName.equals("age"))
			hisAge = new String(ch, start, length);
		else if (tagName.equals("address"))
			hisAddress = new String(ch, start, length);
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// 解析元素结束
		if (localName.equals("man")) {
			System.out.println("hisName------>" + hisName);
			System.out.println("hisAge------>" + hisAge);
			System.out.println("hisAddress------>" + hisAddress);
		}
	}

	@Override
	public void endDocument() throws SAXException {
		// 解析结束
		System.out.println("---------end-----------");
	}

}

输出结果:
这里写图片描述

3、PULL解析

XML数据:

<students>
  <student id="001">
    <name>张三</name>
    <age>20</age>
  </student>  
  <student id="002">
    <name>李四</name>
    <age>21</age>
  </student>
</students>

TwoActivity.java

/**
 * Created by magic on 2015年2月23日. PULL解析
 */
public class TwoActivity extends Activity {
	List<Student> students;
	String s = "<students><student id='001' ><name>张三</name><age>20</age></student>"
			+ "<student id='002'><name>李四</name><age>21</age></student></students>";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_activity);
		try {
			pullJXXml();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * pull解析xml
	 * 
	 * @throws Exception
	 */
	private void pullJXXml() throws Exception {
		// 创建一个XmlPullParser实例
		XmlPullParser parser = Xml.newPullParser();
		InputStream inputStream = new ByteArrayInputStream(s.getBytes());
		// try {
		// 设置输入流 并指明编码方式
		parser.setInput(inputStream, "UTF-8");
		int event = parser.getEventType();
		Student s = null;
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			// 判断当前事件是否为文档开始标签
			case XmlPullParser.START_TAG:
				if (parser.getName().equals("students")) {
					// 初始化students集合
					students = new ArrayList<Student>();
				} else if (parser.getName().equals("student")) {
					// 得到标签属性
					String id = parser.getAttributeValue(0);
					s = new Student();
					s.setId(id);
				} else if (parser.getName().equals("name")) {
					// 让解析器指向name属性的值
					String name = parser.nextText();
					s.setName(name);
				} else if (parser.getName().equals("age")) {
					// 让解析器指向age属性的值
					String age = parser.nextText();
					s.setAge(Integer.valueOf(age));
				}
				break;
			// 判断当前事件是否为标签元素结束事件
			case XmlPullParser.END_TAG:
				if (parser.getName().equals("student")) {
					// 将student添加到students集合
					students.add(s);
				}
			}
			// 进入下一个元素并触发相应事件
			event = parser.next();
		}

		// 增强for输出
		for (Student student : students) {
			System.out.println("--->" + student.toString());
		}
	}

	/**
	 * 自定义对象
	 */
	class Student {
		private String id;
		private String name;
		private int age;

		public Student() {
		}

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

		public String getId() {
			return id;
		}

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

		public String getName() {
			return name;
		}

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

		public int getAge() {
			return age;
		}

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

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

输出结果:
这里写图片描述

4、DOM解析

未完待续…

5、XML解析实战

天气预报袖珍版Demo,该实例就是通过了网络接口获取数据(XML形式)、解析数据、设置数据等步骤。由于篇幅问题就不放上来了下面给出下载地址。
效果图:
这里写图片描述

很简单的,可以下下来跑一下~~~若有问题恳请指正,欢迎评论交流~
Demo下载地址:http://download.csdn.net/detail/magic_jss/9656315;

爱我所爱,无怨无悔!

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio ,可以使用 XmlPullParser 解析器来解析 XML 数据XmlPullParser 解析器是 Android 提供的一种轻量级、高效的解析器,它可以逐行解析 XML 数据,并提供了丰富的方法来获取标签、属性和文本等数据。 以下是使用 XmlPullParser 解析解析 XML 数据的示例代码: ```java try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(new StringReader(xmlData)); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if(eventType == XmlPullParser.START_TAG) { String tagName = xpp.getName(); if (tagName.equals("name")) { String name = xpp.nextText(); // 处理姓名数据 } else if (tagName.equals("age")) { int age = Integer.parseInt(xpp.nextText()); // 处理年龄数据 } // 处理其他标签数据 } eventType = xpp.next(); } } catch (Exception e) { e.printStackTrace(); } ``` 在上面的示例代码xmlData 是要解析XML 数据字符串,eventType 表示当前处理的事件类型。在处理开始标签时,可以使用 getName() 方法获取标签名;在获取标签文本内容时,可以使用 nextText() 方法获取文本内容,并根据标签类型进行相应的数据类型转换。在处理其他标签数据时,可以根据需要使用其他方法获取标签属性等数据。 需要注意的是,XmlPullParser 解析器是基于事件的解析器,所以在解析 XML 数据时需要逐行读取数据并处理相应的事件。同时,XmlPullParser 解析器也具有一定的灵活性,可以根据需要选择合适的解析方式来获取数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值