Java與XML:采用DOM操作XML文件
1.DOM介紹
DOM 是用與平臺和語言無關(guān)的方式表示XML文檔的官方 W3C 標(biāo)準(zhǔn)。DOM 是以層次結(jié)構(gòu)組織的節(jié)點或信息片斷的集合。這個層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個文檔和構(gòu)造層次結(jié)構(gòu), 然后才能做任何工作。 由于它是基于信息層次的,因而 DOM 被認(rèn)為是基于樹或基于對象的。DOM 以及廣義的基于樹的處理具有幾個優(yōu)點。首先,由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對數(shù)據(jù)和結(jié)構(gòu)作出更改。 它還可以在任何時候在樹中上下導(dǎo)航, 而不是像 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);
- }
- }
目錄結(jié)構(gòu):在項目的根目錄下面放置一個XML文件
- <?xml version="1.0" encoding="UTF-8"?>
- <學(xué)生花名冊>
- <學(xué)生 性別="男">
- <姓名>李華</姓名>
- <年齡>14</年齡>
- <電話>6287555</電話>
- </學(xué)生>
- <學(xué)生 性別="男">
- <姓名>張三</姓名>
- <年齡>16</年齡>
- <電話>8273425</電話>
- </學(xué)生>
- </學(xué)生花名冊>
運行結(jié)果:
男
李華
14
6287555
男
張三
16
8273425
3.使用DOM操作XML文件,進(jìn)行增刪查改
代碼示例:
- 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();
- // 增加一個元素節(jié)點
- Element newChild = document.createElement("project");
- newChild.setAttribute("id", "NP001");// 添加id屬性
- Element nelement = document.createElement("name");// 元素節(jié)點
- 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);
- // 查找一個元素節(jié)點
- String expression = "/projects/project[3]";
- Element node = (Element) selectSingleNode(expression, root);// 轉(zhuǎn)型一下
- // 修改一個元素節(jié)點
- 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");
- // 刪除一個元素節(jié)點
- 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();
- // 設(shè)置各種輸出屬性
- transformer.setOutputProperty("encoding", "gb2312");
- transformer.setOutputProperty("indent", "yes");
- DOMSource source = new DOMSource();
- // 將待轉(zhuǎn)換輸出節(jié)點賦值給DOM源模型的持有者(holder)
- source.setNode(node);
- StreamResult result = new StreamResult();
- if (filename == null) {
- // 設(shè)置標(biāo)準(zhǔn)輸出流為transformer的底層輸出目標(biāo)
- result.setOutputStream(System.out);
- } else {
- result.setOutputStream(new FileOutputStream(filename));
- }
- // 執(zhí)行轉(zhuǎn)換從源模型到控制臺輸出流
- transformer.transform(source, result);
- } catch (TransformerConfigurationException e) {
- e.printStackTrace();
- } catch (TransformerException e) {
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- // 查找一個單獨的節(jié)點
- 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;
- }
- }
- // 查找所有的節(jié)點
- 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/yinger/archive/2011/09/24/2188793.html
【編輯推薦】