前言
原創文章歡迎轉載,請保留出處。
若有任何疑問建議,歡迎回複。
郵箱:[email protected]
解析XML主要有兩種思想,一種是SAX(Simple API for XML),另一種是DOM(文檔對象模型),其中在J2EE中,提供了JAXP來實作這兩種解析,本文主要利用JAXP實作SAX解析,同時介紹時下流行的DOM4J實作DOM解析。
SAX解析和DOM解析比較
- SAX解析
- 優點:效率高,當遇到大的XML檔案時,不需要掃描完檔案就可以操作。
- 缺點:不能進行RUD操作,每次操作都要重新解析
- DOM解析
- 優點:隻需要解析一次XML
- 缺點:解析完成才能操作,遇到大的XML檔案時耗記憶體。
JAXP實作SAX解析
首先要有一個xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<測試><作者>maxwell_nc</作者><部落格>http://blog.csdn.net/maxwell_nc</部落格></測試>
引用一張經典圖來說明SAX解析
接下來寫代碼:
package maxwell;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SaxPaserDemo {
public static void main(String[] args) throws Exception {
//擷取SAX解析器工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
//通過工廠擷取SAX解析器
SAXParser parser = factory.newSAXParser();
//擷取XML閱讀器
XMLReader reader = parser.getXMLReader();
//關聯事件解析器
reader.setContentHandler(new MyContentHandler());
//解析XML檔案
reader.parse("src/maxwell/demo.xml");
}
}
/*DefaultHandler是ContentHandler接口擴充卡*/
class MyContentHandler extends DefaultHandler{
@Override
public void startDocument() throws SAXException {
// 掃描到xml文檔開始
System.out.println("xml解析開始");
}
@Override
public void endDocument() throws SAXException {
// 掃描到xml文檔結束
System.out.println("xml解析結束");
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// 發現開始标簽,列印标簽名
System.out.println("<"+name+">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 列印标簽體
System.out.println(new String(ch, start, length));
}
}
利用DOM4J實作DOM解析
SAX解析最大缺點就是不能RUD,而DOM可以,無奈本身JAXP的性能低下,是以現在流行使用DOM4J解析XML。
利用DOM4J來解析XML,代碼實作上更加簡單簡潔。
package maxwell;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jDemo {
public static void main(String[] args) throws Exception {
//利用dom4j擷取XML閱讀器
SAXReader reader = new SAXReader();
//擷取document對象
Document document = reader.read("src/maxwell/demo.xml");
//擷取根節點對象
Element root = document.getRootElement();
//列印标簽體
System.out.println(root.element("作者").getText());
System.out.println(root.element("部落格").getText());
//添加節點并添加屬性,設定标簽體
Element newEle = DocumentHelper.createElement("添加節點");
newEle.addAttribute("測試", "test");
newEle.setText("測試dom4j的添加節點功能");
root.add(newEle);
//寫回檔案
XMLWriter writer = new XMLWriter(new FileOutputStream("src/maxwell/demo.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
}
而且帶有美化輸出的功能,修改後:
總結
實際上無論JAXP還是DOM4J都支援DOM和SAX解析,但DOM4J操作都非常簡單,而且性能要比JAXP強大,但要注意,要使用DOM4J必須導入jar檔案。