1.SAX剖析
在运用DOM剖析XML文档时,须要读取全部XML文档,在内存中构建全部DOM树的Document对象,从而再对XML文档举行操纵。此种情况下,假如XML文档迥殊大,就会斲丧计算机的大批内存,严峻的情况下可以还会致使内存溢出。
SAX剖析许可在读取文档的时刻,即对文档举行处置惩罚,而没必要比及全部文档装载完才对文档举行操纵。
经由过程继续
DefaultHandler
,来开辟一个SAX剖析器
【注重】SAX重要用于对XML文档的剖析,不能去修正、删除和增加元素。
1.1.SAX剖析机制
sax是一种推式的机制,你建立一个sax剖析器,剖析器在发明xml文档中的内容时就通知你(把事宜推给你,有点类似于java swing中的事宜监听)。怎样处置惩罚这些发明的内容,由顺序员本身决议。
在基于sax的顺序中,有五个最经常使用的sax事宜:
1.startDocument()–>通知你剖析器发明了文档的最先,通知你剖析器最先扫描文档
2.endDocument()–>通知你剖析器发明了文档末端
3.startElement()–>通知你剖析器发明了一个肇端标签,该事宜通知你标签的称号、该元素一切的属性名和值
4.characters()–>通知你剖析器发明了一些文本,将获得一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以获得剖析器发明的文本
5.endElement()–>通知你剖析器发明了一个完毕标签,该事宜通知你元素的称号
1.2.SAX剖析实例
依旧运用DOM剖析中用到的XML例子,以下:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <门生 地点="香港"> <名字>周小星</名字> <岁数>23</岁数> <引见>进修受苦</引见> </门生> <门生 地点="澳门"> <名字>林晓</名字> <岁数>25</岁数> <引见>是一个好门生</引见> </门生></班级>
【步骤】:
1.运用SAXParserFactory建立SAX剖析工场
SAXParserFactory spf = SAXParserFactory.newInstance();
2.经由过程SAX剖析工场获得剖析器对象
SAXParser sp = spf.newSAXParser();
3.将剖析对象和事宜处置惩罚器对象关联
sp.parse("src/myClass.xml",new MyHandler());
这里的MyHandler
须要本身定义,而且它要继续DefaultHandler
,然后在MyHandler
类中重写上文提到的5个sax事宜要领,固然也可以只重写本身须要的。
比方如今我写的MyHandler
以下:
class MyHandler extends DefaultHandler{ /** * 发明文档最先,该函数只会被挪用一次 */ @Override public void startDocument() throws SAXException { System.out.println("startDocument"); } /** * 发明文档完毕,该函数只会被挪用一次 */ @Override public void endDocument() throws SAXException { System.out.println("endDocument"); } /** * 发明XML中的一个元素最先,会被重复挪用 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("元素称号:"+qName); } /** * 发明XML中的一个元素完毕,会被重复挪用 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { } /** * 发明XML文件中的文本,会被重复挪用 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // 显现文本内容 String text = new String(ch,start,length); if(!text.trim().equals("")){ System.out.println(text); } } }
运转效果以下:
可以看到,这是对XML文档的一种遍历,而sax可以做的也只是遍历了。
那末,假如如今我们有如许一个需求:只显现一切门生的姓名和岁数,不显现门生的引见,怎样完成呢?
我们可以在MyHandler
类中定义两个布尔变量isName和isAge,在startElement
要领中标识是不是是姓名元素或许岁数元素,假如是的话才在characters
要领中猎取对应的文本,以下:
1.定义两个布尔变量
private boolean isName = false;private boolean isAge = false;
2.在startElement
要领中增加推断
@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("名字")){ this.isName = true; }else if(qName.equals("岁数")){ this.isAge = true; } }
3.在characters
要领中依据标识符举行推断是不是猎取文本
@Overridepublic void characters(char[] ch, int start, int length) throws SAXException { // 显现文本内容 String text = new String(ch,start,length); if(!text.trim().equals("")&&(isName||isAge)){ System.out.println(text); } isName = false; isAge = false; }
末了要记得将两个布尔变量复位成false。
运转效果以下:
1.SAX剖析
在运用DOM剖析XML文档时,须要读取全部XML文档,在内存中构建全部DOM树的Document对象,从而再对XML文档举行操纵。此种情况下,假如XML文档迥殊大,就会斲丧计算机的大批内存,严峻的情况下可以还会致使内存溢出。
SAX剖析许可在读取文档的时刻,即对文档举行处置惩罚,而没必要比及全部文档装载完才对文档举行操纵。
经由过程继续
DefaultHandler
,来开辟一个SAX剖析器
【注重】SAX重要用于对XML文档的剖析,不能去修正、删除和增加元素。
1.1.SAX剖析机制
sax是一种推式的机制,你建立一个sax剖析器,剖析器在发明xml文档中的内容时就通知你(把事宜推给你,有点类似于java swing中的事宜监听)。怎样处置惩罚这些发明的内容,由顺序员本身决议。
在基于sax的顺序中,有五个最经常使用的sax事宜:
1.startDocument()–>通知你剖析器发明了文档的最先,通知你剖析器最先扫描文档
2.endDocument()–>通知你剖析器发明了文档末端
3.startElement()–>通知你剖析器发明了一个肇端标签,该事宜通知你标签的称号、该元素一切的属性名和值
4.characters()–>通知你剖析器发明了一些文本,将获得一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以获得剖析器发明的文本
5.endElement()–>通知你剖析器发明了一个完毕标签,该事宜通知你元素的称号
1.2.SAX剖析实例
依旧运用DOM剖析中用到的XML例子,以下:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <门生 地点="香港"> <名字>周小星</名字> <岁数>23</岁数> <引见>进修受苦</引见> </门生> <门生 地点="澳门"> <名字>林晓</名字> <岁数>25</岁数> <引见>是一个好门生</引见> </门生></班级>
【步骤】:
1.运用SAXParserFactory建立SAX剖析工场
SAXParserFactory spf = SAXParserFactory.newInstance();
2.经由过程SAX剖析工场获得剖析器对象
SAXParser sp = spf.newSAXParser();
3.将剖析对象和事宜处置惩罚器对象关联
sp.parse("src/myClass.xml",new MyHandler());
这里的MyHandler
须要本身定义,而且它要继续DefaultHandler
,然后在MyHandler
类中重写上文提到的5个sax事宜要领,固然也可以只重写本身须要的。
比方如今我写的MyHandler
以下:
class MyHandler extends DefaultHandler{ /** * 发明文档最先,该函数只会被挪用一次 */ @Override public void startDocument() throws SAXException { System.out.println("startDocument"); } /** * 发明文档完毕,该函数只会被挪用一次 */ @Override public void endDocument() throws SAXException { System.out.println("endDocument"); } /** * 发明XML中的一个元素最先,会被重复挪用 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("元素称号:"+qName); } /** * 发明XML中的一个元素完毕,会被重复挪用 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { } /** * 发明XML文件中的文本,会被重复挪用 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // 显现文本内容 String text = new String(ch,start,length); if(!text.trim().equals("")){ System.out.println(text); } } }
运转效果以下:
可以看到,这是对XML文档的一种遍历,而sax可以做的也只是遍历了。
那末,假如如今我们有如许一个需求:只显现一切门生的姓名和岁数,不显现门生的引见,怎样完成呢?
我们可以在MyHandler
类中定义两个布尔变量isName和isAge,在startElement
要领中标识是不是是姓名元素或许岁数元素,假如是的话才在characters
要领中猎取对应的文本,以下:
1.定义两个布尔变量
private boolean isName = false;private boolean isAge = false;
2.在startElement
要领中增加推断
@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("名字")){ this.isName = true; }else if(qName.equals("岁数")){ this.isAge = true; } }
3.在characters
要领中依据标识符举行推断是不是猎取文本
@Overridepublic void characters(char[] ch, int start, int length) throws SAXException { // 显现文本内容 String text = new String(ch,start,length); if(!text.trim().equals("")&&(isName||isAge)){ System.out.println(text); } isName = false; isAge = false; }
末了要记得将两个布尔变量复位成false。
运转效果以下:
以上就是XML—XML剖析之SAX的内容,更多相关内容请关注ki4网(www.ki4.cn)!