DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然後才能做任何工作。由於它是基於信息層次的,因而DOM被認爲是基於樹或基於對象的。 DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來 也要簡單得多。
下面列出實例,首先是需要操作的XML文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><書架>
<書 name="XXX">
<書名>java編程思想4</書名>
<售價>39</售價>
</書>
<書>
<書名>java編程思想2</書名>
<作者>BBB</作者>
<售價>0</售價>
</書>
</書架>
接下來是JAXP對XML的操作
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XmlParserDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 新建一個DocumentBuilderFactory 解析器工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 通過解析器工廠產生一個解析器對象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析器對象有一個parse的方法可以讀進來一個xml文件
// 讀到的xml文件是以document對象的方式保存在內存中的
Document document = builder.parse("src/book.xml");
// listAllNode(document);
//listAllNode1(document);
readElement(document);
//update(document);
//readAttribute(document);
//add(document);
//add1(document);
//delete(document);
//removeAttribute(document);
//addAttribute(document);
//updateAttribute(document);
}
//打印所有節點的名字
public static void listAllNode(Node node) {
System.out.println(node.getNodeName());
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
listAllNode(child);
}
}
//打印所有元素節點的名字
public static void listAllNode1(Node node) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
listAllNode1(child);
}
}
//讀取某個xml元素的內容
public static void readElement(Document document)
{
NodeList list= document.getElementsByTagName("書名");
Node node= list.item(0);
System.out.println(node.getTextContent());
}
//讀取某個xml元素的屬性
public static void readAttribute(Document document)
{
NodeList list= document.getElementsByTagName("書");
Node node= list.item(0);
NamedNodeMap map= node.getAttributes();
for(int i=0;i<map.getLength();i++)
{
Node attr = map.item(i);
System.out.println(attr.getNodeName()+"="+attr.getNodeValue());
}
}
//增加一個標籤
public static void add(Document document) throws Exception
{
//首先要創建一個標籤
Node node= document.createElement("售價");
node.setTextContent("39");
//把標籤掛到根節點上去
Node price =document.getElementsByTagName("書").item(0);
price.appendChild(node);
//通過transformer方法把一個內存中的document寫到文件中去
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//在中間創建一個標籤
public static void add1(Document document) throws Exception
{
//首先要創建一個標籤
Node node= document.createElement("作者");
node.setTextContent("AAA");
//把標籤掛到根節點上去
Node author =document.getElementsByTagName("書").item(0);
author.insertBefore(node,document.getElementsByTagName("售價").item(0) );
//通過transformer方法把一個內存中的document寫到文件中去
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//刪除某個標籤 。
public static void delete(Document document) throws Exception
{
//先找到要刪除的節點
Node author= document.getElementsByTagName("作者").item(0);
//通過這個節點找到他的父親節點,再通過父親節點刪除當前節點
author.getParentNode().removeChild(author);
//新建一個transformer工廠類
TransformerFactory factory= TransformerFactory.newInstance();
//通過transformer的一個靜態方法得到transformer的一個實例類
Transformer trans= factory.newTransformer();
//transformer實例類有一個寫的方法 把內存中的文件寫到硬盤上 從source到result
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//更改某個標籤
public static void update(Document document) throws Exception
{
Node node= document.getElementsByTagName("書名").item(0);
node.setTextContent("數據結構");
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")) );
}
//刪除某個屬性
public static void removeAttribute(Document document) throws Exception
{
Element element= (Element)document.getElementsByTagName("書").item(0);
element.removeAttribute("name");
TransformerFactory factory= TransformerFactory.newInstance();
//通過transformer的一個靜態方法得到transformer的一個實例類
Transformer trans= factory.newTransformer();
//transformer實例類有一個寫的方法 把內存中的文件寫到硬盤上 從source到result
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//增加某個屬性
public static void addAttribute(Document document) throws Exception
{
Attr att= document.createAttribute("name");
att.setTextContent("AAA");
Element element= (Element)document.getElementsByTagName("書").item(0);
element.setAttributeNode(att);
TransformerFactory factory= TransformerFactory.newInstance();
//通過transformer的一個靜態方法得到transformer的一個實例類
Transformer trans= factory.newTransformer();
//transformer實例類有一個寫的方法 把內存中的文件寫到硬盤上 從source到result
trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
}
//更新某個屬性
public static void updateAttribute(Document document) throws Exception
{
Element element= (Element)document.getElementsByTagName("書").item(0);
element.setAttribute("name", "bbb");
TransformerFactory factory= TransformerFactory.newInstance();
Transformer trans= factory.newTransformer();
trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
}
}