我們瞭解完最簡單的dom解析之後,馬上就可以學習sax解析,先上今天的道具:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<people><name type="english">linbulu</name><sex>boy</sex><age>18</age></people>
好,我們今天要做的就是把這個people解析出來,存進一個map裏邊。廢話少說了,馬上開幹!!
public class TestSax {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File("D:\\fileDemo\\user.xml"), new MyHandler());
}
}
class MyHandler extends DefaultHandler
{
String currentNodeName=null;
Map<String, String> map=null;
@Override
public void startDocument() throws SAXException
{
System.out.println("1------startDocument------1");
map=new HashMap<String, String>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
System.out.println("2------startElement--------2----"+qName);
currentNodeName=qName; //正在解析的元素
for(int i=0;i<attributes.getLength();i++){
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
System.out.println("3------characters--------3");
String value=new String(ch,start,length);
map.put(currentNodeName,value);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
System.out.println("4------endElement--------4");
}
@Override
public void endDocument() throws SAXException
{
System.out.println("5------endDocument-------5");
System.out.println(map.toString());
}
下載地址 大家跑起來,看看控制檯輸出啥了??
大家是不是覺得非常簡單啊。不過我還是要稍微得說一下:
1、要繼承 DefaultHandler
2、一共要重寫5個方法
startDocument:開始解析文檔。
startElement:開始解析節點並且讀取節點的屬性
characters:讀取節點裏的內容
endElement:結束讀取這一個節點
endDocument:結束文檔的解析
其中,解析文檔和結束文檔都只執行一次,其他的執行多次。大家看懂了嗎??
然後咱們獲取值的方法也是很獨特,在第三個步驟中:
String value=new String(ch,start,length);
好了,明天來更加叼的,這些都是小兒科,不過,有一點大家一定要注意,面試的時候經常會考的:
sax解析和dom解析的區別,大家如果只講實現給人家聽,百分之九十就掛了。咱們根據實現,來深究一下他們2個傢伙的區別在哪裏?
dom解析是直接把xml一個parse操作,轉成了document對象,簡單粗暴,不過這樣會耗費很多內存的資源。所以,在臨牀上我們一般只用來讀一些配置文件或者比較小的xml文件
sax解析則是一個節點一個節點得往下讀,讀到後面的,前面的也就釋放掉了,所以不會存在說耗費大量內存一說。所以對大型的xml文件用sax解析就再好不過了。