XML文件解析之PULL模式解析

前端之家收集整理的这篇文章主要介绍了XML文件解析之PULL模式解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。



Pull模式解析原理:

与SAX解析器模拟相似,也提供了类似的事件驱动.使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

Pull模式解析步骤:

1、 得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:

1)通过Xml这个工具类的.newPullParser()方式得到

2)通过XmlPullParserFactory工厂创建

//得到XmlPullParserFacotry工厂

  1. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  2. 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;
  1. importjava.io.StringReader;
  2. importorg.xmlpull.v1.XmlPullParser;
  3. importorg.xmlpull.v1.XmlPullParserException;
  4. importorg.xmlpull.v1.XmlPullParserFactory;
  5. publicclassSimpleXmlPullApp{
  6. publicstaticvoidmain(Stringargs[])throwsXmlPullParserException,IOException{
  7. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  8. factory.setNamespaceAware(true);
  9. XmlPullParserxpp=factory.newPullParser();
  10. xpp.setInput(newStringReader("<foo>HelloWorld!</foo>"));
  11. inteventType=xpp.getEventType();
  12. while(eventType!=XmlPullParser.END_DOCUMENT){
  13. if(eventType==XmlPullParser.START_DOCUMENT){
  14. System.out.println("Startdocument");
  15. }elseif(eventType==XmlPullParser.START_TAG){
  16. System.out.println("Starttag"+xpp.getName());
  17. }elseif(eventType==XmlPullParser.END_TAG){
  18. System.out.println("Endtag"+xpp.getName());
  19. }elseif(eventType==XmlPullParser.TEXT){
  20. System.out.println("Text"+xpp.getText());
  21. }
  22. eventType=xpp.next();
  23. System.out.println("Enddocument");
  24. }

输出结果:

Start document

Start tag foo

Text Hello World!

End tag foo

还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里

person.xml:

[html] ?
    <?xmlversion="1.0"encoding="UTF-8"?>
  1. <persons>
  2. <personid="23">
  3. <name>李明</name>
  4. <age>30</age>
  5. </person>
  6. <personid="20">
  7. <name>李向梅</name>
  8. <age>25</age>
  9. </persons>

Person类:

?
    publicclassPerson{
  1. privateIntegerid;
  2. privateStringname;
  3. privateshortage;
  4. publicIntegergetId(){
  5. returnid;
  6. }
  7. publicvoidsetId(Integerid){
  8. this.id=id;
  9. publicStringgetName(){
  10. returnname;
  11. publicvoidsetName(Stringname){
  12. this.name=name;
  13. publicshortgetAge(){
  14. returnage;
  15. publicvoidsetAge(shortage){
  16. this.age=age;
  17. @Override
  18. publicStringtoString(){
  19. return"Person[age="+age+",id="+id+",name="+name+"]";
  20. }

业务bean

?
    publicstaticList<Person>readXml(InputStreaminputStream)
  1. throwsException{
  2. List<Person>persons=null;
  3. //XMLPullParser对象
  4. XmlPullParserparser=Xml.newPullParser();
  5. //设置输入流和编码
  6. parser.setInput(inputStream,"UTF-8");
  7. //文件开始代码
  8. inteventCode=parser.getEventType();
  9. Personperson=null;
  10. while(eventCode!=XmlPullParser.END_DOCUMENT){
  11. switch(eventCode){
  12. //文档开始
  13. caseXmlPullParser.START_DOCUMENT:
  14. //初始化
  15. persons=newArrayList<Person>();
  16. break;
  17. caseXmlPullParser.START_TAG://开始标签
  18. if("person".equals(parser.getName())){
  19. person=newPerson();
  20. person.setId(Integer.parseInt(parser.getAttributeValue(0)));
  21. elseif(person!=null){
  22. if("name".equals(parser.getName())){
  23. //nextNext()如果下一个元素的内容是文本的时候适合用
  24. person.setName(parser.nextText());
  25. elseif("age".equals(parser.getName())){
  26. person.setAge(newShort(parser.nextText()));
  27. caseXmlPullParser.END_TAG://结束标签
  28. if("person".equals(parser.getName())&&person!=null){
  29. persons.add(person);
  30. person=null;//再掷为null
  31. break;
  32. //下一个节点
  33. eventCode=parser.next();
  34. returnpersons;
  35. }


测试:

?
    publicclassSAXPersonServiceTestextendsAndroidTestCase{
  1. privatestaticfinalStringTAG="LogTest";
  2. //PULL方式
  3. publicvoidtestPULLReadXml()throwsException{
  4. System.out.println("testPULLReadXml");
  5. InputStreaminputStream=SAXPersonServiceTest.class.getClassLoader()
  6. .getResourceAsStream("person.xml");
  7. List<Person>list=PULLPersonService.readXml(inputStream);
  8. System.out.println(list.size());
  9. for(Personperson:list){
  10. System.out.println(person);
  11. 如需转载引用请注明出处:<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工厂

  1. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  2. XmlPullParserxmlparser=factory.newPullParser();


2、 再根据XmlPullParser对象设置输入流和编码格式

?
    "UTF-8");


3、 然后循环遍历所有的结点可以通过文档开始的代码来判断读入到哪个节点

关于xmlparser.getEventType()其值有:

Start_DOCUMENT:文档开始

END_DOCUMENT:文档结束

START_TAG:开始读标签

END_TAG标签结束

TEXT:所读的是文本内容

一个简单示例:

?
    importjava.io.IOException;
  1. importjava.io.StringReader;
  2. importorg.xmlpull.v1.XmlPullParser;
  3. importorg.xmlpull.v1.XmlPullParserException;
  4. importorg.xmlpull.v1.XmlPullParserFactory;
  5. publicclassSimpleXmlPullApp{
  6. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  7. factory.setNamespaceAware(true);
  8. XmlPullParserxpp=factory.newPullParser();
  9. xpp.setInput(newStringReader("<foo>HelloWorld!</foo>"));
  10. inteventType=xpp.getEventType();
  11. while(eventType!=XmlPullParser.END_DOCUMENT){
  12. if(eventType==XmlPullParser.START_DOCUMENT){
  13. System.out.println("Startdocument");
  14. }elseif(eventType==XmlPullParser.START_TAG){
  15. System.out.println("Starttag"+xpp.getName());
  16. }elseif(eventType==XmlPullParser.END_TAG){
  17. System.out.println("Endtag"+xpp.getName());
  18. }elseif(eventType==XmlPullParser.TEXT){
  19. System.out.println("Text"+xpp.getText());
  20. }
  21. eventType=xpp.next();
  22. System.out.println("Enddocument");
  23. }

输出结果:

Start document

Start tag foo

Text Hello World!

End tag foo

还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里

person.xml:

[html] ?
    <?xmlversion="1.0"encoding="UTF-8"?>
  1. <persons>
  2. <personid="23">
  3. <name>李明</name>
  4. <age>30</age>
  5. </person>
  6. <personid="20">
  7. <name>李向梅</name>
  8. <age>25</age>
  9. </persons>

Person类:

?
    publicclassPerson{
  1. privateIntegerid;
  2. privateStringname;
  3. privateshortage;
  4. publicIntegergetId(){
  5. returnid;
  6. }
  7. publicvoidsetId(Integerid){
  8. this.id=id;
  9. publicStringgetName(){
  10. returnname;
  11. publicvoidsetName(Stringname){
  12. this.name=name;
  13. publicshortgetAge(){
  14. returnage;
  15. publicvoidsetAge(shortage){
  16. this.age=age;
  17. @Override
  18. publicStringtoString(){
  19. +name+"]";
  20. }

业务bean

?
    publicstaticList<Person>readXml(InputStreaminputStream)
  1. throwsException{
  2. List<Person>persons=null;
  3. //XMLPullParser对象
  4. XmlPullParserparser=Xml.newPullParser();
  5. //设置输入流和编码
  6. "UTF-8");
  7. //文件开始代码
  8. inteventCode=parser.getEventType();
  9. Personperson=null;
  10. while(eventCode!=XmlPullParser.END_DOCUMENT){
  11. switch(eventCode){
  12. //文档开始
  13. caseXmlPullParser.START_DOCUMENT:
  14. //初始化
  15. persons=newArrayList<Person>();
  16. break;
  17. //开始标签
  18. if("person".equals(parser.getName())){
  19. person=newPerson();
  20. 0)));
  21. elseif(person!=null){
  22. if("name".equals(parser.getName())){
  23. //nextNext()如果下一个元素的内容是文本的时候适合用
  24. person.setName(parser.nextText());
  25. elseif("age".equals(parser.getName())){
  26. person.setAge(newShort(parser.nextText()));
  27. //结束标签
  28. if("person".equals(parser.getName())&&person!=null){
  29. persons.add(person);
  30. //再掷为null
  31. break;
  32. //下一个节点
  33. eventCode=parser.next();
  34. returnpersons;
  35. }


测试:

?
    publicclassSAXPersonServiceTestextendsAndroidTestCase{
  1. privatestaticfinalStringTAG="LogTest";
  2. //PULL方式
  3. publicvoidtestPULLReadXml()throwsException{
  4. System.out.println("testPULLReadXml");
  5. InputStreaminputStream=SAXPersonServiceTest.class.getClassLoader()
  6. .getResourceAsStream("person.xml");
  7. List<Person>list=PULLPersonService.readXml(inputStream);
  8. System.out.println(list.size());
  9. for(Personperson:list){
  10. System.out.println(person);
  11. 如需转载引用请注明出处:<ahref="http://blog.csdn.net/jiahui524">http://blog.csdn.net/jiahui524</a>
原文链接:https://www.f2er.com/xml/299785.html

猜你在找的XML相关文章