Pull模式解析原理:
与SAX解析器模拟相似,也提供了类似的事件驱动.使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull模式解析步骤:
1、 得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:
1)通过Xml这个工具类的.newPullParser()方式得到
2)通过XmlPullParserFactory工厂创建
//得到XmlPullParserFacotry工厂
- XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
-
- XmlPullParserxmlparser=factory.newPullParser();
2、 再根据XmlPullParser对象设置输入流和编码格式
parser.setInput(inputStream,"UTF-8");
3、 然后循环遍历所有的结点可以通过文档开始的代码来判断读入到哪个节点
关于xmlparser.getEventType()其值有:
Start_DOCUMENT:文档开始
END_DOCUMENT:文档结束
START_TAG:开始读标签
END_TAG:标签结束
TEXT:所读的是文本内容
一个简单示例:
importjava.io.IOException;
- importjava.io.StringReader;
- importorg.xmlpull.v1.XmlPullParser;
- importorg.xmlpull.v1.XmlPullParserException;
- importorg.xmlpull.v1.XmlPullParserFactory;
- publicclassSimpleXmlPullApp{
- publicstaticvoidmain(Stringargs[])throwsXmlPullParserException,IOException{
- XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
- factory.setNamespaceAware(true);
- XmlPullParserxpp=factory.newPullParser();
- xpp.setInput(newStringReader("<foo>HelloWorld!</foo>"));
- inteventType=xpp.getEventType();
- while(eventType!=XmlPullParser.END_DOCUMENT){
- if(eventType==XmlPullParser.START_DOCUMENT){
- System.out.println("Startdocument");
- }elseif(eventType==XmlPullParser.START_TAG){
- System.out.println("Starttag"+xpp.getName());
- }elseif(eventType==XmlPullParser.END_TAG){
- System.out.println("Endtag"+xpp.getName());
- }elseif(eventType==XmlPullParser.TEXT){
- System.out.println("Text"+xpp.getText());
- }
- eventType=xpp.next();
- System.out.println("Enddocument");
- }
输出结果:
Start document
Start tag foo
Text Hello World!
End tag foo
还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里
person.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
- <persons>
- <personid="23">
- <name>李明</name>
- <age>30</age>
- </person>
- <personid="20">
- <name>李向梅</name>
- <age>25</age>
- </persons>
Person类:
publicclassPerson{
- privateIntegerid;
- privateStringname;
- privateshortage;
- publicIntegergetId(){
- returnid;
- }
- publicvoidsetId(Integerid){
- this.id=id;
- publicStringgetName(){
- returnname;
- publicvoidsetName(Stringname){
- this.name=name;
- publicshortgetAge(){
- returnage;
- publicvoidsetAge(shortage){
- this.age=age;
- @Override
- publicStringtoString(){
- return"Person[age="+age+",id="+id+",name="+name+"]";
- }
业务bean
publicstaticList<Person>readXml(InputStreaminputStream)
- throwsException{
- List<Person>persons=null;
-
- XmlPullParserparser=Xml.newPullParser();
- //设置输入流和编码
- parser.setInput(inputStream,"UTF-8");
- //文件开始代码
- inteventCode=parser.getEventType();
- Personperson=null;
- while(eventCode!=XmlPullParser.END_DOCUMENT){
- switch(eventCode){
- //文档开始
- caseXmlPullParser.START_DOCUMENT:
- //初始化
- persons=newArrayList<Person>();
- break;
- caseXmlPullParser.START_TAG:
- if("person".equals(parser.getName())){
- person=newPerson();
- person.setId(Integer.parseInt(parser.getAttributeValue(0)));
- elseif(person!=null){
- if("name".equals(parser.getName())){
- //nextNext()如果下一个元素的内容是文本的时候适合用
- person.setName(parser.nextText());
- elseif("age".equals(parser.getName())){
- person.setAge(newShort(parser.nextText()));
- caseXmlPullParser.END_TAG:
-
- if("person".equals(parser.getName())&&person!=null){
- persons.add(person);
- person=null;
- break;
- //下一个节点
- eventCode=parser.next();
- returnpersons;
- }
测试:
publicclassSAXPersonServiceTestextendsAndroidTestCase{
- privatestaticfinalStringTAG="LogTest";
- //PULL方式
- publicvoidtestPULLReadXml()throwsException{
- System.out.println("testPULLReadXml");
- InputStreaminputStream=SAXPersonServiceTest.class.getClassLoader()
- .getResourceAsStream("person.xml");
- List<Person>list=PULLPersonService.readXml(inputStream);
- System.out.println(list.size());
- for(Personperson:list){
- System.out.println(person);
- 如需转载引用请注明出处:<ahref="http://blog.csdn.net/jiahui524">http://blog.csdn.net/jiahui524</a>
Pull模式解析原理:
与SAX解析器模拟相似,也提供了类似的事件驱动.使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull模式解析步骤:
1、 得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:
1)通过Xml这个工具类的.newPullParser()方式得到
2)通过XmlPullParserFactory工厂创建
//得到XmlPullParserFacotry工厂
- XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
-
- XmlPullParserxmlparser=factory.newPullParser();
2、 再根据XmlPullParser对象设置输入流和编码格式
"UTF-8");
3、 然后循环遍历所有的结点可以通过文档开始的代码来判断读入到哪个节点
关于xmlparser.getEventType()其值有:
Start_DOCUMENT:文档开始
END_DOCUMENT:文档结束
START_TAG:开始读标签
END_TAG:标签结束
TEXT:所读的是文本内容
一个简单示例:
importjava.io.IOException;
- importjava.io.StringReader;
- importorg.xmlpull.v1.XmlPullParser;
- importorg.xmlpull.v1.XmlPullParserException;
- importorg.xmlpull.v1.XmlPullParserFactory;
- publicclassSimpleXmlPullApp{
- XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
- factory.setNamespaceAware(true);
- XmlPullParserxpp=factory.newPullParser();
- xpp.setInput(newStringReader("<foo>HelloWorld!</foo>"));
- inteventType=xpp.getEventType();
- while(eventType!=XmlPullParser.END_DOCUMENT){
- if(eventType==XmlPullParser.START_DOCUMENT){
- System.out.println("Startdocument");
- }elseif(eventType==XmlPullParser.START_TAG){
- System.out.println("Starttag"+xpp.getName());
- }elseif(eventType==XmlPullParser.END_TAG){
- System.out.println("Endtag"+xpp.getName());
- }elseif(eventType==XmlPullParser.TEXT){
- System.out.println("Text"+xpp.getText());
- }
- eventType=xpp.next();
- System.out.println("Enddocument");
- }
输出结果:
Start document
Start tag foo
Text Hello World!
End tag foo
还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里
person.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
- <persons>
- <personid="23">
- <name>李明</name>
- <age>30</age>
- </person>
- <personid="20">
- <name>李向梅</name>
- <age>25</age>
- </persons>
Person类:
publicclassPerson{
- privateIntegerid;
- privateStringname;
- privateshortage;
- publicIntegergetId(){
- returnid;
- }
- publicvoidsetId(Integerid){
- this.id=id;
- publicStringgetName(){
- returnname;
- publicvoidsetName(Stringname){
- this.name=name;
- publicshortgetAge(){
- returnage;
- publicvoidsetAge(shortage){
- this.age=age;
- @Override
- publicStringtoString(){
- +name+"]";
- }
业务bean
publicstaticList<Person>readXml(InputStreaminputStream)
- throwsException{
- List<Person>persons=null;
- //XMLPullParser对象
- XmlPullParserparser=Xml.newPullParser();
- //设置输入流和编码
- "UTF-8");
- //文件开始代码
- inteventCode=parser.getEventType();
- Personperson=null;
- while(eventCode!=XmlPullParser.END_DOCUMENT){
- switch(eventCode){
- //文档开始
- caseXmlPullParser.START_DOCUMENT:
- //初始化
- persons=newArrayList<Person>();
- break;
- //开始标签
- if("person".equals(parser.getName())){
- person=newPerson();
- 0)));
- elseif(person!=null){
- if("name".equals(parser.getName())){
- //nextNext()如果下一个元素的内容是文本的时候适合用
- person.setName(parser.nextText());
- elseif("age".equals(parser.getName())){
- person.setAge(newShort(parser.nextText()));
- //结束标签
-
- if("person".equals(parser.getName())&&person!=null){
- persons.add(person);
- //再掷为null
- break;
- //下一个节点
- eventCode=parser.next();
- returnpersons;
- }
测试:
publicclassSAXPersonServiceTestextendsAndroidTestCase{
- privatestaticfinalStringTAG="LogTest";
- //PULL方式
- publicvoidtestPULLReadXml()throwsException{
- System.out.println("testPULLReadXml");
- InputStreaminputStream=SAXPersonServiceTest.class.getClassLoader()
- .getResourceAsStream("person.xml");
- List<Person>list=PULLPersonService.readXml(inputStream);
- System.out.println(list.size());
- for(Personperson:list){
- System.out.println(person);
- 如需转载引用请注明出处:<ahref="http://blog.csdn.net/jiahui524">http://blog.csdn.net/jiahui524</a>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|