Android——xml文件的解析

解析方法:DOM、SAX、PULL

  1. DOM:将xml转化为树进行遍历
public void DOMParser() {
    try {
      // 1.创建DocumentBuilder实例
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
       // 2.创建Document实例
	Document doc = builder.parse(file);
	// 3.获取xml文件的根节点(persons)
	Element element = doc.getDocumentElement();
	// 4.获取根节点的子节点列表(person的列表)
	NodeList personList = element.getElementsByTagName("person");// TODO
	// NodeList personList = element.getChildNodes();//这个方法不行
	// 5. 遍历所有的person节点
	for (int i = 0; i < personList.getLength(); i++) {
	// 6.获取单个person节点
	Element person = (Element) personList.item(i);
	// 7.读取person的属性
	String id = person.getAttribute("id");
	System.out.println("person   id: " + id);
	// 8.获取person的子节点列表
	NodeList childList = person.getChildNodes();
	// 9.遍历person子节点
	for (int j = 0; j < childList.getLength(); j++) {
	        // 10.访问子节点
		Node child = (Node) childList.item(j);
		if (child.getNodeType() == Node.ELEMENT_NODE) {// 如果子节点是一个元素节点
		// 11.获取元素名称
		String name = child.getNodeName();
		if ("name".equals(name)) {// 获取person name
			System.out.println("名字: "
		        + child.getFirstChild().getNodeValue());
		} else if ("age".equals(name)) {// 获取person age
			System.out.println("年龄:"
		        + child.getFirstChild().getNodeValue());
						}
					}
				}
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

2.SAX:从上往下挨个遍历标签

// 1.创建一个Handler类,继承DefaultHandler
	class SaxHandler extends DefaultHandler {

		/** 上一个节点名称 */
		private String tag;

		// 需要重写五个方法:
		// 1.startDocument():开始文档时做预处理
		// 2.endDocument():结束文档时做善后处理
		// 3.startElement():遇到开始标签是调用该方法
		// 4.endElement():遇到结束标签时调用该方法
		// 5.characters():内容

		public void startDocument() throws SAXException {
			System.out.println("调用startDocument()方法");
		}

		public void endDocument() throws SAXException {
			System.out.println("调用endDocument()方法");
		}

		// 在该方法中读取标签的属性
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			System.out.println("调用startElement()方法"+"localName:"+localName+"qName:"+qName);
			if ("person".equals(qName)) {
				System.out.println("person:       ");
				System.out.println("     id: " + attributes.getValue("id"));
			}
			tag = qName;
		}

		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			System.out.println("调用endElement()方法");
		}

		// 读取标签内容
		// 每次都开始结束标签时都调用
		public void characters(char[] ch, int start, int length)
				throws SAXException {

			System.out.println("调用characters()方法");

			String data = new String(ch, start, length);
			if ("name".equals(tag)) {
				System.out.println("name: " + data);
			} else if ("age".equals(tag)) {
				System.out.println("age: " + data);
			}
		}
	}

	// 2.sax 解析
	public void SAXParser() {
		try {
			//2.1创建解析器
			javax.xml.parsers.SAXParser parser = SAXParserFactory.newInstance()
					.newSAXParser();
			//2.2创建处理器
			SaxHandler handler = new SaxHandler();
			//2.3创建文件输入流
			FileInputStream fis = new FileInputStream(file);
			//2.4解析文件
			parser.parse(file, handler);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

3.Pull:与SAX类似,在android开发中应用较多

public static void xmlPullParser(InputStream is) {

		try {
			// 1.获取输入流
			// 2.获取解析器
			XmlPullParser parser = Xml.newPullParser();
			parser.setInput(is, "utf-8");
			// 3.获取事件类型
			int eventType = parser.getEventType();
			// 4.遍历节点
			while(eventType != XmlPullParser.END_DOCUMENT){
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT://文件开启
					break;
				case XmlPullParser.START_TAG://标签开始
					//4.1获取节点名称
					String name = parser.getName();
					if(name.equals("person")){
						//4.2 获取节点属性值
						String id = parser.getAttributeValue(0);
					}else if(name.equals("name")){
						//4.3 获取下个文本值
						System.out.println("name: "+ parser.nextText());
					}else if(name.equals("age")){
						System.out.println("age: "+ parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG://标签结束

					break;

				default:
					break;
				}

				eventType = parser.next();
			}

			is.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
时间: 2024-08-01 03:02:06

Android——xml文件的解析的相关文章

Android学习(48) -- 获取xml文件并解析.

1.根据xml的格式创建JavaBean public class News { private String title; private String detail; private String comment; private String imageUrl; @Override public String toString() { return "News [title=" + title + ", detail=" + detail + ",

Android 5.0 system_fonts.xml文件的解析过程

Android 5.0 system_fonts.xml文件的解析过程 首先看看看5.0 中familyset version="22" 的格式 20 <family name="sans-serif"> 21 <font weight="100" style="normal">Roboto-Thin.ttf</font> 22 <font weight="100"

Java之Pull方式生成xml文件和解析xml文件

Pull XML解析器早已经被google集成到android sdk当中,它是google官方推荐的解析器. 如果我们要在Java桌面.J2ME等当中使用Pull方式生成xml文件和解析xml文件,需要用到kxml2: KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/ 普通XML PULL解析器的官网是http://xmlpull.org/ 实验开始: 在Eclipse中新建一个java项目,其中新建一个libs文件夹,拷贝从网上下载的k

用SAX和PULL进行XML文件的解析与生成

XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻辑性不是很分明.所以今天做了个类来将其中的多个步骤进行了分割,以后直接拿来用即可. 1.SAX: 首先先讲解SAX中各个方法的作用: 我们以这个不规则的xml语句做例子: <abc:kale sex=m age=21>jack</abc:kale> startDocument:开始解析

php对xml文件的解析

近来较少写博客了,得克服懒惰的秉性啊! 今天研究了一下php对xml文件的解析. 用到了php的simplexml_load_file()方法,该方法会将xml文件生成一个SimpleXMLElement对象,该对象是继承了Traversable接口的对象,即可以像数组那样遍历其子集. 这样,我们就可以循环得到xml文件的内容,不多说废话,上例子. 假设有如下内容,名为test.xml的xml文件: <?xml version="1.0" encoding="utf-8

android xml产生和解析

public static void writeToXml(Map<String, Object> map,Writer writer) throws Exception, IllegalStateException, IOException{          XmlSerializer serializer = Xml.newSerializer();          serializer.setOutput(writer);       serializer.startDocument

说说你知道的XML文件的解析方式,它们有什么区别

说说你知道的XML文件的解析方式,它们有什么区别 DOM(document object model)解析 将整个xml全部读到内存中去,形成树状结构. 优点:解析效率高,且可以对文档进行增删的操作 缺点:当xml文件很大,会导致内存溢出. SAX(Simple API for XML)解析 读取一行,解析一行,基于事件驱动 优点:不会造成内存溢出 缺点:解析效率较慢,且只能进行查阅的操作 原文地址:https://www.cnblogs.com/javaisbest/p/11588010.ht

【Android】XML文件的解析

1.首先我们可以在res包路径下创建一个raw包,然后在raw下创建一个email.xml 文件,并修改其内容如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <email> 3 <from>[email protected]</from> 4 <to>[email protected]</to> 5 <date>2016/4/5</

android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化

Android内置了PULL解析器的XPP3实现,以及SAX解析器等,可以直接使用PULL或SAX解析XML,直接把JAVA中进行PULL或SAX解析的代码直接拿来用,遗忘的话,可以参考java拾遗1,2,3关于XML的解析: 如有如下XmlUtils类实现PULL方式解析XML到List和序列化List到XML: Student实体类代码: 1 package cn.csc.bean; 2 3 public class Student { 4 5 private String id; 6 7