xml 解析的四種方法
1 DOM解析
是將這個xml檔案裝入記憶體
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");
Element bookStore = document.getDocumentElement();//獲取根節點。
節點有三種:元素節點、屬性節點、文字節點
getTextContent() 獲取節點的文字
getFirstChild().getNodeValue() //獲取子節點,倆個方法都可以獲取文字,視具體情況而定。
2 SAX解析
是將xlm文件從上到下解析,一步一步來解析元素節點,將解析xml的工作交給了Handler,所以需要使用者自己實現DefaultHandler
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParse = factory.newSAXParser();
SAXHandler handler = new SAXHandler();
saxParse.parse(newFileInputStream("books.xml"), handler);
public void startDocument() throws SAXException {
}
public void endDocument() throws SAXException {
}
當文件開始解析和結束解析會呼叫上面的方法
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {}
public void endElement(String arg0, String arg1, String arg2) throws SAXException {}
解析elements,
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
}
用來儲存整個xml文件的,可以通過String st = new String(ch, start, length);來獲得當前元素的內容,空白節點也算
3 JDOM解析:有點類似DOM解析
匯入jdom.jar 。org.jdom2
SAXBuilder builder = new SAXBuilder();
InputStream is = new FileInputStream("books.xml");
Document document = builder.build(is);
Element element = document.getRootElement(); //獲取根節點
List<Element> bookList = element.getChildren();
處理亂碼問題:通過InputStreamReader來實現
InputStream is = new FileInputStream("books.xml");
Reader reader = new InputStreamReader(is, "utf-8");
Document document = builder.build(reader);
4 DOM4j解析:
匯入jar,獲取元素使用的都是迭代器
SAXReader reader = new SAXReader();
Reader r = new InputStreamReader(new FileInputStream("books.xml"), "UTF-8");
Document document = reader.read(r);
Element element = document.getRootElement();
Iterator<Element> iterator = element.elementIterator();
總結
DOM和SAX解析是官方提供的,DOM解析是平臺無關的,SAX是基於事件驅動的,剩下的倆種是從這裡衍生出來的,只能Java使用
DOM:形成樹結構,便於理解,解析過程中樹結構留在了記憶體中,可以一邊修改一邊解析,xml檔案過大時可能會造成記憶體溢位
SAX:是基於事件驅動解析的,即一步一步來解析,從元素的開始標籤到結束,記憶體耗費小,適用於只處理資料的情況。 不宜編碼,訪問同一xml的不同位置比較費勁
JDOM:使用具體類,獲取子節點或元素都是通過集合形式
DOM4J:使用抽象和介面,效能優異,功能強大
解析速度:SAX最快,一般使用DOM4J