XML的SAX解析器创建

来源:互联网 发布:sql server 2005 x64 编辑:程序博客网 时间:2024/05/16 11:14

Sun公司的jaxp解析中的sax解析:

首先通过javax.xml.parsers.SAXParserFactory类创建工厂

SAXParserFactory factory=SAXParserFactory.newInstance()

通过工厂创建解析器javax.xml.parsers.SAXParser

SAXParser parser=factory.newSAXParser();

现在就可以开始解析XML文件了

比如,通过parse(InputStream is, DefaultHandler dh)方法,其中第二个参数类调用了ContentHandlerDTDHandlerEntityResolverErrorHandler借口。

不过还可以继续往下,通过SAXParser的getXMLReader()方法获得XMLReader对象。

通过方法setContentHandler(ContentHandler handler)和parse(InputSource input)开始解析。

 

参考文档中有个类XMLReaderFactory有静态方法createXMLReader()返回XMLReader对象,试了一下发现报错提示没加载org.xml.sax.driver驱动。

 

 

解析时的顺序很奇怪,比如解析下面这段XML文件。

-
- <Root>- <ITEM>  <Type>采掘</Type>   </ITEM>- <ITEM>  <Type>地测</Type>   </ITEM>- <ITEM>  <Type>机运</Type>   </ITEM>- <ITEM>  <Type>其它</Type>   </ITEM>- <ITEM>  <Type>一通三防</Type>   </ITEM>

解析代码如下:
@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("startDocument");}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("endDocument");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// TODO Auto-generated method stubSystem.out.println("startElement"+uri+" localname:"+localName+" qname:"+qName+"sssss");}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubSystem.out.println("endElement"+" localname:"+localName+" qname:"+qName+"eeeeeeeeeeee");}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubSystem.out.println("characters"+new String(ch,start,length)+"ccccc");}

输出片段如图
       很明显,每Startelement和endElement一次都会characters一次,但真的只有一次吗?输出写的是System.out.println("characters"+new String(ch,start,length)+"ccccc");
        但上面却很诡异的输出成3次,这是为什么?还有最后一次endElement时没有characters一次!
       10.25:
              每个(start or end)Element后必然Character一次,在startElement后如果没有数据(空格也是数据),接着就是endElement,那么不Character,直接endElement。
       如果startElement后有数据就会Character,Character后没有endElement,那么就会开始读下一行,换行会导致Character一次,在新的一行中如果一开始读到的是数据
       (空格、缩进也是数据)会Character一次,如果读到的是标签,那么会Element一次。
             总而言之,在一个XML文件中,解析时读到的不是Element就是Character,并且是一个一个挨着进行的(空格换行是Character)。如果把XML写出紧凑的格式,那么标
    签与标签中将会全是我们定义的数据,即每次Character得到的都是我们要的数据。紧凑的格式 指的是不用换行不在非必要时用空格写的成的XML文件,上面的是漂亮的XML。
 
       经测试,发现每次startElement后characters里面的char类型值是有长度的,但是输出显示不了。
       一个英文字符占一个char,一个汉字占3个char,当前面解析出来的数据占用空间大于后面解析出来的数据所占空间时,char所占空间不变。

DOM解析会得到疑问的解析:SUN的DOM解析


     Pull解析:
  
public  void getHome(InputStream xml) throws Exception{XmlPullParser pullParser = Xml.newPullParser();pullParser.setInput(xml, "UTF-8");//为Pull解析器设置要解析的XML数据//pullParser.setInput(xml, "GB2312");int event = pullParser.getEventType();while(event != XmlPullParser.END_DOCUMENT){Log.v("BreakPoint","111111111111111111111");switch (event) {case XmlPullParser.START_DOCUMENT:Log.v("BreakPoint",Integer.toString(  XmlPullParser.START_DOCUMENT));break;case XmlPullParser.START_TAG:Log.v("BreakPoint",Integer.toString(  XmlPullParser.START_TAG));break;case XmlPullParser.END_TAG:Log.v("BreakPoint",Integer.toString(  XmlPullParser.END_TAG));break;default:break;}event = pullParser.next();Log.v("BreakPoint",Integer.toString(event));}}


XML生成步奏(XmlSerializer):1.通过android.util.Xml类的newSerializer()方法得到生成器对象xml。2.xml.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);此方法用于自动换行,可在生成过程中使用,什么时候用什么时候起作用。3.xml.setOutput(out, "UTF-8");第一个参数是输出流,即指向生成的xml文件。4.xml.startDocument("UTF-8", true); 开始写XML文件,此句主要生成<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>信息,第一个参数决定encoding='UTF-8',第二个参数决定standalone='yes' ,如果填null则不会生成对应的信息。5.xml.startTag(null, "name");  第一个参数是命名空间,第二个是标签名。生成开始标签6.xml.text("who");   生成标签对中间的内容7.xml.endTag(null, "name");  生成结束标签 。  5、6、7合起来生成的是<name>who</name>8.xml.endDocument(); 结束xml生成。  i.其中如果不写startDocument,那么生成的xml文件将不会有<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>信息。  ii.如果startDocument没写编码方式,将用setOutput方法中指定的。如果setOutput也没指定,那么encoding='UTF-8'将不会生成。如果setOutput与startDocument写的编码不一致,将写startDocument中的。

无意中发现一个类android.os.FileObserver,此类用于监测指定文件或者文件夹(包括文件夹下的子文件、子文件夹)的各种变化,包括增删改等。

原创粉丝点击