JAVA_XML解析整理

1>XML解析技術概述
     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子元素的元素


如有不當,還請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章