使用SAX或者DOM或者pull解析XML文件的使用
2012-08-22 07:38
351 查看
在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。
SAX是一个解析速度快并且占用内存少的xml解析器。 SAX解析XML文件采用的是事件驱动,它在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:
startDocument()
当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()
当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts)
当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。
endElement(String uri, String localName, String name)
在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)
这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
相关类:
SAXParserFactory //SAX工厂类
SAXParser //SAX解析类
SAXReader //SAX读取类
ContentHandler //内容事件
ErrorHandler //错误事件
DTDHandler //DTD事件
EntityResolver //元素事件
解析过程:
<doc>
<para>Hello Android</para>
</doc>
start document
start element : doc
start element : para
characters : Hello Android
end element : para
end element : doc
end document
解析步骤:
1.创建事件处理程序
2.创建SAX解析器
3.将事件处理程序分配给解析器
4.对文档进行解析,将每个事件发送给处理程序
要解析的xml文件代码
DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来是比较直观的,并且在编码方面比基于SAX的实现更加简单。
Pull解析器的运行方式与 SAX 解析器相似。在开始元素和结束元素事件之间,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。也可以使用pull解析器生成XML文件
SAX是一个解析速度快并且占用内存少的xml解析器。 SAX解析XML文件采用的是事件驱动,它在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:
startDocument()
当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()
当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts)
当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。
endElement(String uri, String localName, String name)
在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)
这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
相关类:
SAXParserFactory //SAX工厂类
SAXParser //SAX解析类
SAXReader //SAX读取类
ContentHandler //内容事件
ErrorHandler //错误事件
DTDHandler //DTD事件
EntityResolver //元素事件
解析过程:
<doc>
<para>Hello Android</para>
</doc>
start document
start element : doc
start element : para
characters : Hello Android
end element : para
end element : doc
end document
解析步骤:
1.创建事件处理程序
2.创建SAX解析器
3.将事件处理程序分配给解析器
4.对文档进行解析,将每个事件发送给处理程序
要解析的xml文件代码
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>zhangsan</name> <age>30</age> </person> <person id="20"> <name>lisi</name> <age>25</age> </person> </persons>
/** * 采用SAX解析XML内容 */ public class SAXPersonService { public List<Person> getPersons(InputStream inStream) throws Throwable{//已集合的形式返回 SAXParserFactory factory = SAXParserFactory.newInstance();//得到解析器工厂 SAXParser parser = factory.newSAXParser();//得到解析器 PersonParser personParser = new PersonParser(); parser.parse(inStream, personParser);//解析器对输入流对象进行解析 inStream.close(); return personParser.getPersons(); } private final class PersonParser extends DefaultHandler{ private List<Person> persons = null; private String tag = null; private Person person = null; public List<Person> getPersons() { return persons; } @Override public void startDocument() throws SAXException { persons = new ArrayList<Person>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("person".equals(localName)){ person = new Person(); person.setId(new Integer(attributes.getValue(0))); } tag = localName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(tag!=null){ String data = new String(ch, start, length);//获取文本节点的数据 if("name".equals(tag)){ person.setName(data); }else if("age".equals(tag)){ person.setAge(new Short(data)); } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("person".equals(localName)){ persons.add(person);//把当前的person加到集合persons里面去 person = null; } tag = null; } } }
DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来是比较直观的,并且在编码方面比基于SAX的实现更加简单。
/** * 采用DOM解析XML内容 */ public class DOMPersonService { public static List<Person> getPersons(InputStream inStream) throws Throwable{ List<Person> persons = new ArrayList<Person>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document documnet = builder.parse(inStream);//解析完后已文档树的形式存放到文档对象里面 Element root = documnet.getDocumentElement(); NodeList personNodes = root.getElementsByTagName("person"); for(int i=0 ; i < personNodes.getLength(); i++){ Person person = new Person(); Element personElement = (Element)personNodes.item(i); person.setId(new Integer(personElement.getAttribute("id"))); NodeList personChilds = personElement.getChildNodes(); for(int y=0 ; y < personChilds.getLength(); y++){ if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点 Element childElement = (Element)personChilds.item(y); if("name".equals(childElement.getNodeName())){ person.setName(childElement.getFirstChild().getNodeValue()); }else if("age".equals(childElement.getNodeName())){ person.setAge(new Short(childElement.getFirstChild().getNodeValue())); } } } persons.add(person); } return persons; } }
Pull解析器的运行方式与 SAX 解析器相似。在开始元素和结束元素事件之间,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。也可以使用pull解析器生成XML文件
//用pull技术生成xml文件 public class PULLPersonService { public static void save(List<Person> persons, Writer writer) throws Throwable{ XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(writer); serializer.startDocument("UTF-8", true); serializer.startTag(null, "persons"); for(Person person : persons){ serializer.startTag(null, "person"); serializer.attribute(null, "id", person.getId().toString()); serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge().toString()); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); writer.flush(); writer.close(); } /** * 采用Pull解析XML内容 */ public static List<Person> getPersons(InputStream inStream) throws Throwable{ List<Person> persons = null; Person person = null; XmlPullParser parser = Xml.newPullParser(); parser.setInput(inStream, "UTF-8"); int eventType = parser.getEventType();//产生第一个事件 while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件 switch (eventType) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: String name = parser.getName();//获取解析器当前指向的元素的名称 if("person".equals(name)){ person = new Person(); person.setId(new Integer(parser.getAttributeValue(0))); } if(person!=null){ if("name".equals(name)){ person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值 } if("age".equals(name)){ person.setAge(new Short(parser.nextText())); } } break; case XmlPullParser.END_TAG: if("person".equals(parser.getName())){ persons.add(person); person = null; } break; } eventType = parser.next(); } return persons; } }
相关文章推荐
- 使用SAX或者DOM或者pull解析XML文件
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
- Android:使用SAX或者DOM或者pull操作XML文件
- 使用SAX或者DOM解析XML文件
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- Java乔晓松-使用SAX,DOM,pull解析XML文件以及pull解析生成xml文件
- Android 使用SAX或者DOM或者pull解析XML文件
- android中使用SAX, DOM, 或者pull 来解析XML文档
- 安卓使用DOM,SAX,PULL解析xml,安卓写入xml文件
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
- Android 使用SAX或者DOM或者pull解析XML文件
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- 分别使用sax、dom、pull对下述的xml文件进行解析
- 使用SAX或者DOM或者pull解析XML文件
- 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)
- DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比
- DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比
- Qt中使用DOM解析XML文件或者字符串(实例)
- Android之解析XML文件三种方式(DOM,PULL,SAX)
- android应用开发之利用SAX、DOM和Pull实现对XML文件的解析并进行单元测试