1.DOM介紹
DOM 是用與平台和語言無關的方式表示XML文檔的官方 W3C 標準。DOM 是以階層組織的節點或資訊片斷的集合。這個階層允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文檔和構造階層, 然後才能做任何工作。 由於它是基於資訊層次的,因而 DOM 被認為是基於樹或基於對象的。DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對資料和結構作出更改。 它還可以在任何時候在樹中上下導航, 而不是像 SAX 那樣是一次性的處理。 DOM使用起來也要簡單得多。
2.採用DOM解析XML檔案
代碼執行個體:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* @Author:胡家威
* @CreateTime:2011-9-6 下午10:12:00
* @Description:採用DOM解析XML檔案
*/
public class DomXML {
public void domXMl(String fileName) {
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(fileName);
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList students = root.getChildNodes();
if (students != null) {
for (int i = 0, size = students.getLength(); i < size; i++) {
Node student = students.item(i);
if (student.getNodeType() == Node.ELEMENT_NODE) {
String sexString = student.getAttributes().getNamedItem("性別").getNodeValue();
System.out.println(sexString);
}
for (Node node = student.getFirstChild(); node != null; node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("姓名")) {
String name = node.getFirstChild().getNodeValue();
System.out.println(name);
}
if (node.getNodeName().equals("年齡")) {
String age = node.getFirstChild().getNodeValue();
System.out.println(age);
}
if (node.getNodeName().equals("電話")) {
String tel = node.getFirstChild().getNodeValue();
System.out.println(tel);
}
}
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
DomXML xmlTest = new DomXML();
String fileName = "students.xml";
xmlTest.domXMl(fileName);
}
}
目錄結構:在項目的根目錄下面放置一個XML檔案
<? xml version = "1.0" encoding = "UTF-8" ?> |
運行結果:
男
李華
14
6287555
男
張三
16
8273425
3.使用DOM操作XML檔案,進行增刪查改
程式碼範例:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* @Author:胡家威
* @CreateTime:2011-9-23 下午09:08:03
* @Description:DOM操作XML檔案,增刪查改
*/
public class DealXML {
public static void main(String[] args) {
try {
// Document-->Node
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("products.xml");
Element root = document.getDocumentElement();
// 增加一個元素節點
Element newChild = document.createElement("project");
newChild.setAttribute("id", "NP001");// 添加id屬性
Element nelement = document.createElement("name");// 元素節點
nelement.setTextContent("New Project");
newChild.appendChild(nelement);
Element selement = document.createElement("start-date");
selement.setTextContent("March 20 1999");
newChild.appendChild(selement);
Element eelement = document.createElement("end-date");
eelement.setTextContent("July 30 2004");
newChild.appendChild(eelement);
root.appendChild(newChild);
// 尋找一個元素節點
String expression = "/projects/project[3]";
Element node = (Element) selectSingleNode(expression, root);// 轉型一下
// 修改一個元素節點
node.getAttributeNode("id").setNodeValue("new "+node.getAttribute("id"));
// root.getElementsByTagName("project").item(2).setTextContent("");
expression = "/projects/project";
NodeList nodeList = selectNodes(expression, root);
nodeList.item(1).getAttributes().getNamedItem("id").setNodeValue("New Id");
// 刪除一個元素節點
expression = "/projects/project[2]";
node = (Element) selectSingleNode(expression, root);
root.removeChild(root.getFirstChild());
output(root, "newProjects.xml");
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
public static void output(Node node, String filename) {
TransformerFactory transFactory = TransformerFactory.newInstance();
try {
Transformer transformer = transFactory.newTransformer();
// 設定各種輸出屬性
transformer.setOutputProperty("encoding", "gb2312");
transformer.setOutputProperty("indent", "yes");
DOMSource source = new DOMSource();
// 將待轉換輸出節點賦值給DOM源模型的持有人(holder)
source.setNode(node);
StreamResult result = new StreamResult();
if (filename == null) {
// 設定標準輸出資料流為transformer的底層輸出目標
result.setOutputStream(System.out);
} else {
result.setOutputStream(new FileOutputStream(filename));
}
// 執行轉換從源模型到控制台輸出資料流
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// 尋找一個單獨的節點
private static Node selectSingleNode(String expression, Object source) {
try {
return (Node) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODE);
} catch (XPathExpressionException e) {
e.printStackTrace();
return null;
}
}
// 尋找所有的節點
private static NodeList selectNodes(String expression, Object source) {
try {
return (NodeList) XPathFactory.newInstance().newXPath().evaluate(expression, source, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
return null;
}
}
}
左邊是修改前的,右邊的是修改了之後產生的XML檔案
更多詳情請見:http://www.cnblogs.com/stephen-liu74/archive/2011/09/12/2151209.html
通過 Wiz 發布