XML解析方式分爲兩種:DOM和SAX
DOM:(Document Object Model,即文檔對象模型),是有W3C組織推薦的處理XML的一種方式
SAX:(Simple API for XML)不是官方標準,但是它是XML社區事實上的標準,幾乎所有的XML解析器都支持它。
2>DOM(使用javax.xml.*):該方式會得到並維護XML文檔的DOM樹,所以你可以直接對該對象進行處理。
(1).讀取XML文檔實例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/com/xml/dom.xml");//path爲文檔路徑
(2)./** 遍歷文檔(只打印出標籤名) */
public void list(Node node){//Document也是一個Node
if(node.getNodeType() == Node.ELEMENT_NODE){
System.out.println(node.getNodeName());//當前節點名稱
}
NamedNodeMap attMap = node.getAttributes();
for(int i=0;attMap!=null && i<attMap.getLength();i++){//節點的屬性不屬於節點的孩子
Node att = attMap.item(i);//屬性也是節點
System.out.println(att.getNodeName()+"="+att.getNodeValue());
}
NodeList list = node.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node chiled = list.item(i);
list(chiled);//這裏注意遞歸
}
}
(3).讀取當前節點下的特定節點
public void read(Document node,String wantFind){
Node title = node.getElementsByTagName("wantFind").item(0);
System.out.println(title.getTextContent());//文本內容
System.out.println(author.getAttribute("name"));//屬性
}
(4).添加節點
public void add(Document node) throws Exception{
//首先創造節點
Element aa = node.createElement("aaa");//<aaa>000</aaa>
aa.setTextContent("000");
//將節點掛載到想要被添加的節點
Element root = (Element)node.getElementsByTagName("root").item(0);
root.appendChild(aa);
//root.insertBefore(aa,node.getElementsByTagName("body").item(0));在body之前插入了文檔
//只做到這步,也只是寫入到內存中了,並沒有反應到文檔中去
//通過下面的更新文檔方法進行文檔的更新
}
(5).刪除節點
public void delete(Document document)throws Exception{
//這是由父找子,然後再刪除子的方式
Element aaa = (Element)document.getElementsByTagName("aaa").item(0);
document.getChildNodes().item(0).removeChild(aaa);
//下面的這種更加好(子找父,然後刪自己)
Node head = document.getElementsByTagName("head").item(0);
head.getParentNode().removeChild(head);
//刪除屬性--只要涉及到對於屬性的操作,都把node節點轉成element
//((Element)head).removeAttribute("");
//通過下面的更新文檔方法進行文檔的更新
}
(6).將文檔更新
public void update(Document document) throws Exception{
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new File("src/com/xml/dom.xml")));
}
3>SAX(使用javax.xml.*):該方法是事件響應模式運作的,這意味着你無法得到文檔整體,只能在解析特定事件觸發時對特定事件做出處理。
(1).SAX加載xml文檔的步驟:
//1.得到sax工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.通過工廠得到解析器
SAXParser parser = factory.newSAXParser();
//3.通過解析器得到一個xml文檔的讀取器
XMLReader reader = parser.getXMLReader();
//註冊事件處理器
reader.setContentHandler(new MyContentHander());
//4.通過讀取器讀取xml文檔
reader.parse("src/com/xml/dom.xml");
(2).對於上面的MyContentHander類的說明:
這是自己寫的事件處理器,繼承ContentHandler,在該類中書寫你對於xml文檔的業務處理。
class MyContentHander implements ContentHandler{
//解析到開始標籤時的處理
@Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
//以下是獲取各標籤頭的方法,具體業務由自己把控
System.out.println("<"+qName+" ");
for(int i=0;i<atts.getLength();i++){
System.out.println(atts.getQName(i)+""+atts.getValue(i)+" ");
}
System.out.println(">");
}
//解析到結束標籤時的處理
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
}
//還有好多可重載方法,請自行調查,鑑於DOM4J等工具類的存在,其實不用查了,一般不使用。
}
4>DOM4J的一般的使用:
1.首先下載DOM4J的jar包,導入到你的工程中
2.加載xml文件
(1)普通方式:(使用了new File(文件路徑))
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/com/xml/dom.xml"));
Element root = document.getRootElement();
(2)類裝載器方式:
SAXReader reader = new SAXReader();
//InputStream in = DOM4J.class.getClassLoader().getResourceAsStream("dom1.xml");
//上面的也還是有問題的,在再次讀取文件時,可能始終得不到改後的數據
//以下的方法是最優的(通過URL對象去實現)
URL url = DOM4J.class.getClassLoader().getResource("dom1.xml");
FileInputStream in = new FileInputStream(url.getPath());
Document document = reader.read(in);
3.通過上面的方法就得到了document對象,也就是DOM樹,那麼增刪改查就和DOM方式相同了。
4.對於DOM4J還提供了結合XPATH的快速查找方式:
root.selectSingleNode("xpath");//注意,該方法需要jaxen-1.1-beta-6.jar
5.以下是XPATH簡要介紹:
/AAA:找出爲AAA的元素
/AAA/BBB/DDD:找出AAA下面BBB的DDD元素
//BBB:無視層級關係,找出所有BBB元素
//DDD/BBB:找出凡是DDD下的BBB元素
/*/*/*/BBB:找出有3個祖先元素的BBB元素
/AAA/BBB[1]:找出AAA第一個BBB元素
/AAA/BBB[last()]:找出AAA下最後一個BBB子元素
//BBB[@id]:找出有id屬性的BBB元素
//BBB[@name]:找出有name屬性的BBB元素
//BBB[@*]:找出有任意屬性的BBB元素
//BBB[@id='b1']:找出含有屬性id且其值爲"b1"的BBB元素
//BBB[normalize-space(@name)='bbb']:選擇含有屬性name且其值(用normalize-space函數去掉前後空格後)爲'bbb'的元素
//*[count(BBB)=2]:選擇含有2個BBB子元素的元素
如有不當,還請指正。