一、JAXP
1、JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成
在 javax.xml.parsers 包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的 DOM 或 SAX 的解析器對象。
2、使用JAXP進行DOM解析
javax.xml.parsers 包中的DocumentBuilderFactory用於創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象並返回。
3、 獲得JAXP中的DOM解析器
(1) 調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。
(2) 調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。
(3) 調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了。
二、DOM編程
1、DOM模型(document object model)
Ø DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關係,解析成一個個Node對象(節點)。
Ø 在dom中,節點之間關係如下:
² 位於一個節點之上的節點是該節點的父節點(parent)
² 一個節點之下的節點是該節點的子節點(children)
² 同一層次,具有相同父節點的節點是兄弟節點(sibling)
² 一個節點的下一個層次的節點集合是節點後代(descendant)
² 父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)
Ø 節點類型
三、Node對象
1、Node對象提供了一系列常量來代表結點的類型,當開發人員獲得某個Node類型後,就可以把Node節點轉換成相應的節點對象(Node的子類對象),以便於調用其特有的方法。(查看API文檔)
2、 Node對象提供了相應的方法去獲得它的父結點或子結點。編程人員通過這些方法就可以讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。
四、添加節點【重點】
//節點的添加
public static void createElement(Document doc) throws Exception{
//確定添加節點的位置:父節點
Node book=doc.getElementsByTagName("書").item(0);
//生成一個新節點
Element element=doc.createElement("出版社");
//element.setTextContent("清華大學");
Text text=doc.createTextNode("清華大學出版社");
element.appendChild(text);
//在指定位置把新生成的節點添加進去
book.appendChild(element);
//將內存中樹狀的結構doc把寫入到xml文件
//(1)生成工廠對象
TransformerFactory factory=TransformerFactory.newInstance();
//(2)由工廠對象生成轉換對象Transformer
Transformer trans=factory.newTransformer();
//(3)通過trans實現doc轉換到xml文檔中,需要一個DOMSource對象代表源樹
trans.transform(new DOMSource(doc),new StreamResult(new File("src/book.xml")) );
}
public static void createFixedElement(Document doc) throws Exception{
//確定插入點的位置
Node author=doc.getElementsByTagName("作者").item(0);
Node parent=author.getParentNode();
Node brother=author.getNextSibling();
//創建一個新節點
Element element=doc.createElement("出版社");
element.setTextContent("清華大學出版社");
//插入節點:在書這個節點中在作者節點之前添加了出版社
parent.insertBefore(element,brother);
//將內存中樹狀的結構doc把寫入到xml文件
//(1)生成工廠對象
TransformerFactory factory=TransformerFactory.newInstance();
//(2)由工廠對象生成轉換對象Transformer
Transformer trans=factory.newTransformer();
//(3)通過trans實現doc轉換到xml文檔中,需要一個DOMSource對象代表源樹
trans.transform(new DOMSource(doc),new StreamResult(new File("src/book.xml")) );
}
五、刪除結點
public static void deleteElement(Document doc) throws Exception{
//獲取要刪除的那個節點對象
Node node=doc.getElementsByTagName("售價").item(1);
node.getParentNode().removeChild(node);
//將內存中樹狀的結構doc把寫入到xml文件
//(1)生成工廠對象
TransformerFactory factory=TransformerFactory.newInstance();
//(2)由工廠對象生成轉換對象Transformer
Transformer trans=factory.newTransformer();
//(3)通過trans實現doc轉換到xml文檔中,需要一個DOMSource對象代表源樹
trans.transform(new DOMSource(doc),new StreamResult(new File("src/book.xml")) );
}
六、修改節點
public static void updateElement(Document doc) throws Exception{
//獲取要修改的那個節點
Node node=doc.getElementsByTagName("售價").item(0);
node.setTextContent("50");
if(node instanceof Element){
Element element=(Element)node;
Attr att=element.getAttributeNode("type");
att.setValue("美元");
}
//將內存中樹狀的結構doc把寫入到xml文件
//(1)生成工廠對象
TransformerFactory factory=TransformerFactory.newInstance();
//(2)由工廠對象生成轉換對象Transformer
Transformer trans=factory.newTransformer();
//(3)通過trans實現doc轉換到xml文檔中,需要一個DOMSource對象代表源樹
trans.transform(new DOMSource(doc),new StreamResult(new File("src/book.xml")) );
}
<書名>jsp</書名>
Node節點node node.getNodeType() 類型
——元素element node.getNodeName() 名稱
node.getNodeValue() 返回的爲NULL 因爲Element節點,所以nodeValue值爲null
node.getTextContent jsp程序設計
Text text=(Test)node.getChildNodes().item(0);
Text.getNodeValue();——jsp程序設計 因爲文本節點,所以nodeValue值,是jsp程序設計
1 類型 2 元素 3 文本
void func(Node node){
//
}
Node是接口類型
func(doc);實參:可以是Node類型對象,還可以是Node的子類的對象
當形參是接口類型,那麼實參是實現了該接口的類的對象。