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,此类用于监测指定文件或者文件夹(包括文件夹下的子文件、子文件夹)的各种变化,包括增删改等。
- XML的SAX解析器创建
- XML的SAX解析器
- SAX方式创建/解析xml
- xml的sax解析
- xml的sax解析
- xml的SAX解析
- XMl的SAX解析
- xml Sax解析器
- 创建SAX解析器
- SAX解析XML的例子.
- xml的sax简单解析
- xml文件的sax解析
- SAX解析 XML的Demo
- IOS XML的SAX解析
- xml文件的sax解析
- XML解析-SAX的使用
- Android的sax解析xml
- SAX解析XML的原理
- 一次关于Waiting for table metadata lock的处理
- ASIHTTPRequest 详解
- UVa 10037 - Bridge
- VISTA、Win Server 2008、Win7 等系统音频系统底层API
- C++性能之内联函数
- XML的SAX解析器创建
- table布局 height=100%无效分析
- centos下面安装mysql
- You have tried to change the API from what has been previously approved.
- 计算几何求公式
- iPhone操作队列 VS Java线程池
- C/C++ 文件输入输出
- RHEL5无人值守安装
- UVa 311 - Packets