SAX解析XML:
SAX基本原理:
采用事件驱动解析XML文件,以流式方式逐行的去读,它不需要解析完整个文档,在按内容顺序解析文档的过各中,SAX会判断当前讲到的字符是否合法XML语法中的某部分,如果符合就触发事件(例如startDocument()、endDocument()诸如此类的事件),它的特点是不会记录前面所碰到的标签,并且它是一个解析速度快并且占用内存少的XML解析器,
SAX解析步骤:
1、从SAXPraserFactory中创建一个新的实例
2、再从SAXParserFactory里得到一个新的SAX解析器对象SAXParser
3、再调用SAXParser对象的.parse()方法里面带两个参数一个是输入流一个是DefaultHandler对象这样就可以了。而DefaultHandler是实现了ContentHandler接口的。ContentHandler接口中定义了一系列的方法事件:诸如:
- publicabstractvoidstartDocument()
方法作用:文档解析触发此事件
publicabstractvoidendDocument()
方法作用:文档解析结束时触发此事件
publicabstractvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)
方法作用:当开始读取元素时触发此事件
参数说明:
uri:命名空间
localName:不带命名空间的前缀的标签名
qName:不定期命名空间前缀的标签名
atts:得到所有的属性各和相应的值
publicabstractvoidendElement(Stringuri,StringqName)
方法作用:读取的标签结束时触发此事件,参数说明同上
publicabstractvoidcharacters(char[]ch,intstart,intlength)
方法作用:用来处理在XML文件中读到的内容
参数说明:
ch:用于存放文件的内容
start:所读到的字符串在这个数组中的起始位置
length:长度
我们可以用new String(ch,start,length)来获取内容
下面以person.xml文件为例采用SAX解析器来模拟解析这个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.xml触发的事件为:
读到的标签及内容 |
触发事件 |
{文档开始} |
startDocument() |
<persons> |
startElement(,"persons",null,"{Attributes}") |
"nt" |
characters("<persons>...</persons>","12","2") |
<person> |
startElement(,"person","{Attributes}") |
"ntt" |
characters("<persons>...</persons>","31","3") |
<name> |
startElement(,"name","{Attributes}") |
"李明" |
characters("<persons>...</persons>","40","2") |
</name> |
endElement("",null) |
"ntt" |
characters("<persons>...</persons>","50","3") |
<age> |
startElement(,"age","{Attributes}") |
"30" |
characters("<persons>...</persons>","58","2") |
</age> |
endElement("",null) |
"nt" |
characters("<persons>...</persons>","67","2") |
</person> |
endElement("","79","2") |
又重复<person> |
…. |
{文档结束} |
endDocument() |
实例1:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里:
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:
publicclassSAXPersonService{
- publicstaticList<Person>readXml(InputStreaminputStream)
- throwsException{
-
- SAXParserFactoryspf=SAXParserFactory.newInstance();
- //SAX解析对象
- SAXParsersaxParser=spf.newSAXParser();
- //ContentHandler对象
- XMLContentHandlerhandler=newXMLContentHandler();
- //开始解析
- saxParser.parse(inputStream,handler);
- //关闭流
- inputStream.close();
- returnhandler.getPersons();
- }
XMLContentHandler继承自DefalutHander而DefaultHandler实现ContentHandler接口
/**
-
- *继承于DefaultHandler这个类也是实现ContentHandler
- *@authorAdministrator
- *
- */
- publicclassXMLContentHandlerextendsDefaultHandler{
- privateList<Person>persons;
- privatePersonperson;
- privateStringpreTag;
- publicList<Person>getPersons(){
- returnpersons;
- *文档开始
- publicvoidstartDocument()throwsSAXException{
- persons=newArrayList<Person>();
- *读取的文档内容
- publicvoidcharacters(char[]ch,intlength)
- throwsSAXException{
- if(person!=null){
- Stringdata=newString(ch,length);
- //判断前面的元素是否是"name"
- if("name".equals(preTag)){
- person.setName(data);
- }elseif("age".equals(preTag)){
- person.setAge(newShort(data));
- *元素开始
- publicvoidstartElement(Stringuri,
- Attributesattributes)throwsSAXException{
- //判断目前解析到的元素是否等于"person"
- if("person".equals(localName)){
- person=newPerson();
- //person.setId(Integer.parseInt(attributes.getValue(0)));
- person.setId(Integer.parseInt(attributes.getValue("","id")));
- //当前元素
- preTag=localName;
- *解析完一个元素后就把这个元素加到List里
- publicvoidendElement(Stringuri,StringqName)
- if("person".equals(localName)&&person!=null){
- persons.add(person);
- person=null;
- //再将这个当前元素设为null
- preTag=null;
- }
测试:
publicclassSAXPersonServiceTestextendsAndroidTestCase{
- privatestaticfinalStringTAG="LogTest";
- publicvoidtestSAXReadXml()throwsException{
- //从资源文件中获取输入流
- InputStreaminputStream=SAXPersonServiceTest.class.getClassLoader()
- .getResourceAsStream("itcast.xml");
- List<Person>list=SAXPersonService.readXml(inputStream);
- for(Personperson:list){
- System.out.println(person);
- 如需转载引用请注明出处:<ahref="http://blog.csdn.net/jiahui524">http://blog.csdn.net/jiahui524</a>
?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|