两种XML解析方法

来源:互联网 发布:iphone6s网络模块坏了 编辑:程序博客网 时间:2024/05/17 05:18
xml解析;
概念:
XML(eXtended Markup Language,可扩展的标记性语言)
可扩展:标签:可以自己定义。
<persons>
<person>
<name>张三</name>
<age>30</age>
</person>


<person>
<name>李四</name>
<age>40</age>
</person>
<persons>


{name:zhagnsan,age:30}


HTML:超文本标记语言
文档中:
超文本:文本,图片,音频,视频。。。
标记:标签(固定)
<a><B><center><p>.....







PULL:
基于事件拉取的形式:
事件-->常量值


<person><persons><name><age>...开始标签
相应的动作:比如创建集合,对象。。。


标签和标签之间的内容:文本标签


</name></age></person></persons>....结束标签

开始文档:
结束文档:




pull解析:先创建一个扫描器(解析器对象),扫描整个xml文档。遇到对应的事件,返回一个常量数值。
5个事件:
开始文档事件:0
结束文档事件:1
开始标签事件:2
结束标签事件:3
文本标签事件:4




获取事件的类型--->进行相应的操作
首次:getEventType()
其他:next()
获取文本内容:nextText()
A.获取当前扫描器后的文本内容。
B.同时跳过该结束标签。




操作步骤:
step1:要解析的文件:File/Server
setp2:通过工厂模式,获取解析器对象
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();


step3:设置扫描器要扫描的文件
parser.setInput(InputStream,"utf-8");
step4:解析
A:获取首次的事件类型:start_document:0
B:while(事件类型不是结束文档){
1)获取标签名:parser.getName()-->tagName
2)分支:
根据不同的事件类型:
开始标签:标签名:创建集合,创建对象,获取数值。。。
nextText()
结束标签:标签名:将对象存入集合
3)获取下次事件类型:next()--->手动拉取下次的事件类型

}

pull:基于事件常量的形式解析。(事件对应了一个常量的数值)
开始解析文档事件:0
结束解析文档事件:1-->结束循环
开始解析标签事件:2-->标签名:创建集合,创建对象,获取数值。。
结束解析标签事件:3-->将对象存入集合
文本标签事件:4
SAX:
Simple API for XML


基于事件通知的形式解析。(事件对应了方法)
开始解析文档事件:startDocument()
结束解析文档事件:endDocument()
开始解析标签事件:startElement()
结束解析文档事件:endElement()
文本标签事件:characters()






parser:File,MyHandler
startDocument-->new List


startElement-->开始标签
A:将qName的值放大作用域:tagName
B:qName:person--->new Person


endElement-->结束标签
A:qName:person-->list.add(p)




characters()-->文本标签
String content  = new String(ch,start,length);
A:tagName:name-->setName
B:tagName:age-->setAge


tagName,qName-->persons
content:空白


tagName,qName-->person
content:空白
tagName,qName-->name
content:张老师


content:空白


tagName,qName->age
content:21-->赋值

content:空白






SAX解析:
step1:获取解析器对象:SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
step2:parser.parse(File/InputStream,DefaultHander);
step3:创建MyHandler类,继承DefaultHandler,为了重写5个方法。
step4:
startDocument()-->创建了集合
startElement()-->
A:将qName-->tagName
B:根据qName的值:person,创建对象


endElement()-->
A:将tagName的值,清空
B:根据qName的值:person,将对象存入集合


characters()-->content
A:判断tagName:name,age。。




PULL,SAX解析的异同点


相同点:
1.基于事件
5个事件:
2.底层原理都是IO流


不同点:
PULL:事件拉取,基于常量
5个事件-->5个数值
SAX:自动获取下次,基于通知(自动执行方法)
5个事件-->5个方法




PULL:手动拉去(next()),可以通过代码操作,结束循环,进而结束解析。
SAX:自动执行。无法停止(吃了炫迈)
0 0