1.Xml解析方式-DOM,SAX,Pull
1.DOM解析(Document Object Model)
起源: W3C組織(world wide web)
原理: 將整個XML文檔加載到內存中,以樹形結構形式存在(封裝成DOM對象樹);
特點: 耗內存,但能對xml增刪改查,能讀取任意位置數據(回讀),用于小XML文件
DOM對象
Document 整個文檔(HTML,XML)
Element 標簽元素
Attribute 標簽屬性
Text 標簽內的文本
Common 注釋
瀏覽器解析Html,也是采取DOM解析!
2.SAX解析(Simple API for XML)
起源: 社區論壇
原理: 基于事件驅動的流式解析(XML數據流,邊讀邊解),讀到一個文檔事件就通知處理,處理完就釋放內存,繼續下一個事件
特點: 省內存, 但只能順序讀取xml(不能回讀),無法修改,用于大XML文件
XML事件
startDocument (START_DOCUMENT) 文檔開始事件
endDocument (END_DOCUMENT) 文檔結束事件
startElement (START_TAG) 元素/標簽開始事件
endElement (END_TAG) 元素/標簽結束事件
character (TEXT) 文本事件
3.Pull解析
類似SAX,也是基于事件驅動,適用于移動平臺,Android默認采用該解析方式(XmlPullParser)
SAX解析: 自動觸發事件,不解析完整個文檔就不會結束解析
(說白了就是框架自動讀取觸發事件,通過回調通知程序員,沒有主動權,只能被迫解析完整個文檔)
Pull解析: 手動觸發事件,可以中途結束解析
(說白了就是程序員主動觸發文檔事件自己處理,把主動權交給我們自己,更靈活,可中途結束解析)
2.XML解析庫-Java框架
1.JAXP
JAXP是JDK自帶的XML解析庫,同時支持SAX/DOM兩種解析方式
常用類庫包名:
SAX: org.xml.sax
DOM: org.w3c.dom
JAXP: javax.xml.parsers
// SAX解析, 創建SAX解析器, 注冊文檔事件==================================================================================
SAXParserFactory.newInstance().newSAXParser().parse("XML文件", new MyContentHandler());
class MyContentHandler extends DefaultHandler{ // 事件處理器,被動觸發,回調通知
@Override
public void startElement(String uri, String localName, String name, Attributes attributes){
// 元素開始事件
}
@Override
public void characters(char[] ch, int start, int length){
// 文本事件
}
@Override
public void endElement(String uri, String localName, String name){
// 元素結束事件
}
}
// DOM解析, 創建DOM解析器, 獲取Document對象=================================================================================================
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("xml文件");
// 利用Document Element Attribute等類, 對XML增刪改查
2.Dom4j
Dom4j是由早期開發JDOM的人分離出來而后獨立開發,比JDOM性能更好
Dom4j對Xml文檔增刪改查更方便, 很多商用軟件都采用Dom4j, 例如Hibernate, JAXM
// 元素增刪改查
public void element() throws Exception{
Document document = new SAXReader().read("xml文件");
Element rootElement = document.getRootElement();
// 查詢元素
rootElement.element("元素名").getText();
// 增加元素
rootElement.element("元素名").add(DocumentHelper.createElement("元素名"));
rootElement.element("元素名").addElement("元素名");
// 修改元素名和內容
rootElement.element("元素名").setText("元素內容");
rootElement.element("元素名").setName("元素名");
// 刪除元素
Element element = rootElement.element("元素名");
element.getParent().remove(element);
// 輸出到Xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
// 屬性增刪改查
public void attr() throws Exception{
Document document = new SAXReader().read("xml文件");
Element rootElement = document.getRootElement();
// 查詢屬性
rootElement.element("元素名").attributeValue("屬性名");
// 增加/修改屬性
rootElement.element("元素名").addAttribute("屬性名", "屬性值");
// 刪除屬性
Attribute attr = rootElement.element("元素名").attribute("出版社");
attr.getParent().remove(attr);
// 輸出到Xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
3.XmlPullParser(Android自帶的Pull解析類庫)
// XmlPullParser常用方法
public void setInput (InputStream inputStream, String inputEncoding); // 設置XML文件輸入流
public int getEventType (); // 獲取當前事件類型
public int next (); // 手動觸發下一個事件
public String getName(); // 獲取標簽名
public String getAttributeValue (int index);// 獲取屬性值
public String nextText (); // 當前是開始標簽, 若下個元素為文本,則返回文本; 若是結束標簽,則返回空字符串; 其它情況將拋出異常
// 創建XML解析器
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new FileInputStream("xml文件"), encode);
// 手動循環觸發事件,解析XML
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) { // 文檔結束事件
switch (eventType) {
case XmlPullParser.START_DOCUMENT: // 文檔開始事件
break;
case XmlPullParser.START_TAG: // 標簽開始事件
String tagName = parser.getName().trim(); // 標簽名
String attr = parser.getAttributeValue(...); // 屬性值
String name = parser.nextText().trim(); // 標簽內部文本
break;
case XmlPullParser.END_TAG: // 標簽結束事件
break;
}
eventType = parser.next(); // 手動觸發下一個事件
}
簡書: http://www.lxweimin.com/p/dfe369dce44d
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54236641
GitHub博客:http://lioil.win/2017/01/08/Xml-DOM-SAX.html
Coding博客:http://c.lioil.win/2017/01/08/Xml-DOM-SAX.html