SAX解析:
Simple Api for XML。
SAX在解析文檔時使用的是邊讀取邊解析的方式,而不是一次性的將文檔全部裝入內存中。所以它的讀取速度很快,佔用很少的內存。
僅向前,不能任意的讀取一個節點。
也不能修改XML文件。
SAX讀取一個XML文檔的過程:
解析器:
1: SAXParserFactory
定義工廠 API,使應用程序能夠配置和獲取基於 SAX 的解析器以解析 XML 文檔。
:2: SAXParser – 是SAX解析器。 定義包裝 XMLReader 實現類的 API 。此類的實例可以從 SAXParserFactory.newSAXParser() 方法獲得。
3: XMLReader-用於讀取XML數據。
通過SAXParser. getXMLReader()獲得。
4:parse(String fileName)用於讀取一個XML文檔。
實例:
注意:1:文本的讀取需要需要屏蔽掉 空白符實現類的成員變量來記錄狀態判斷
如:上圖print idx
:2: 對uri qname localname的理解,函數參數的使用要明白其值是什麼
本例對xml的一個解析過濾:
public void readXML(){
XMLReader r=null;
try {
r = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
r.setContentHandler(new DefaultHandler(){
private String qName;
private boolean simpleType=false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
if(qName.equals("user")){
String name=attributes.getValue("name");
String pwd=attributes.getValue("pwd");
System.out.println("user:"+name+","+pwd);
}else if(qName.equals("contact")){
String id=attributes.getValue("id");
System.out.print(" |---contact:"+id+",");
simpleType=true;
}else{
if(simpleType){
this.qName=qName;
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("user")){
System.out.println("/user");
}else if(qName.equals("contact")){
System.out.println();
System.out.println(" /contact");
simpleType=false;
}
this.qName=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(this.qName!=null){
System.out.print(new String(ch,start,length)+",");
}
}
});
try {
r.parse("./XML/Two.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
解釋的xml文檔
<?xml version="1.0" encoding="utf-8"?>
<contacts xmlns="http://www.example.org/Two2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Two2 Two2.xsd">
<user name="jack" pwd="309fee4e541e51de2e41f21bebb342aa">
<contact id="bfee73a0c39fd13e3f6c5b65eae93a24">
<name>張三</name>
<sex>男</sex>
<age>24</age>
<address>湖南益陽</address>
<tel>15576256943</tel>
</contact>
<contact id="c1517f3393e3ff2a3419dba754fbdc13">
<name>李四</name>
<sex>男</sex>
<age>25</age>
<address>湖南長沙</address>
<tel>15576259835</tel>
</contact>
<contact id="ce646fc8ccb569ab3359b848feb71c00">
<name>Rose</name>
<sex>女</sex>
<age>22</age>
<address>湖南常德</address>
<tel>15543269865</tel>
</contact>
</user>
</contacts>
結果:
user:jack,309fee4e541e51de2e41f21bebb342aa
|---contact:bfee73a0c39fd13e3f6c5b65eae93a24,張三,男,24,湖南益陽,15576256943,
/contact
|---contact:c1517f3393e3ff2a3419dba754fbdc13,李四,男,25,湖南長沙,15576259835,
/contact
|---contact:ce646fc8ccb569ab3359b848feb71c00,Rose,女,22,湖南常德,15543269865,
/contact
/user