Xml解析
一.DOM方式解析
1.將xml文檔解析爲一個樹形結構的Document,以後的操作全都操作這個Document,一個節點就是一個對象,存取對象就是存取xml中的內容,將是實際內容的幾倍。
優點:可以遍歷文檔樹,知上下層節點的情況。
2.解析步驟
(1)獲取DBF實例(DocumentBuilderFactory.newInstance())
(2)獲取DB實例(dbf.newDocumentBuilder())
(3)由DB的對象解析xml(db.parser())
調用parse解析---再用normalize()去掉格式化的空白
二.Pull解析
Pull解析
XMLPullParser xp = Xml.newPullParser(); xp.setInput(is,”utf-8”); Int event = xp.getEventType();//觸發一個解析,根據返回的值判斷當前解析狀態 While(event!=XMLPullParser.END_DOCUMENT){ Switch(event){ Case XMLPullParser.START_DOCUMENT//開始解析 Case XMLPullParser.START_TAG//開始元素 Case XMLPullParser.END_TAGCase XMLPullParser.END_DOCUMENT//結束元素 Case XMLPullParser.TEXT//解析文本 Case XMLPullParser.END_DOCUMENT://結束解析 break; } Xp.next();//觸發下一個事件,即下一個元素 } |
|
另一種方法
步驟:
(1)獲取XPPF--XmlPullParserFactory.newInstance()
(2)獲取XPP--xppf.newPullParser()
(3)解析setInput(isr)
(4)XmlUtils解析文檔--開始解析和獲取下一個元素
使用Pull生成xml文檔
XMLSerializer serializer = Xml.newSerializer(); serializer.setOutput(outputStream,”utf-8”); serializer.startTag(null,”persons”);//開始元素,根節點 for(Person person:persons){ serializer.startTag(null,”person”); serializer.attribute(null,”id”,person.getId().toString());//爲元素添加屬性 serializer.startTag(null,”name”); serializer.text(person.getText());//添加文本 serializer.endTag(“name”);
serializer.startTag(null,”age”); serializer.text(person.getAge());//添加文本 serializer.endTag(“age”);
serializer.endTag(“pseron”); } serializer.endTag(null,”persons”); serializer.endDocument(); outputStream.flush(); outputStream.close(); |
注: 1.serializer.setOutput(outputStream,”utf-8”);設置輸出方向,可以是輸出流和寫入器,寫入器比輸出流更加靈活,可以向更多的媒介進行輸出,如硬盤,網絡,內存等。 2.設置xml的標籤即文檔元素,通過startTag()開始一個標籤,必須與之對應一個endTag()方法 3.對標籤添加屬性,文本的方法,attribute(),text(); |
|
三.SAX解析
ContentHandler |
XMLReader |
XMLParser |
InputSource |
DefaultHandler
|
文檔解析接口 |
註冊處理器並啓動解析器 |
同XMLReader,JAXP對其的封裝 |
控制解析器如何讀取文檔
|
解析接口的實現,通過繼承他實現解析xml
|
|
|
|
|
|
步驟:
1.使用SAXParser解析代碼
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); sp.parse(is,handler);//handler是繼承自DefaultHandler類的對象,實現處理文檔 |
2.使用XMLReader
XMLReader reader = new XMLReader(); reader.setContentHandler(handler); reader.parser(is); |
注:需繼承自BaseHandler,在其中處理xml的內容
比較
SAX |
PULL |
DOM |
內存佔用少,速度快,對於反覆檢索xml來說,SAX比較臃腫 |
|
|
|
Pull可以生成xml,DOM可以對xml進行修改 |