一、遞歸周遊整個文檔
1.建立Document對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 建立文檔建構器工廠
DocumentBuilder builder = factory.newDocumentBuilder(); // 通過工廠來獲得文檔建構器
Document doc = builder.parse(new File("example.xml")); //讀取xml檔案生成一個document對象
2.遞歸列印節點名稱
public static void printNodeName(Node node,String line){ if(node instanceof Element){ System.out.println(line + node.getNodeName()); } if(node.hasChildNodes()){ NodeList nl = node.getChildNodes(); for(int i =0;i<nl.getLength();i++){ printNodeName(nl.item(i),line+"\t"); } } }
3.完整事例
package xml;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList;
public class ReadXml {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(ReadXml.class.getClassLoader().getResourceAsStream("config.xml")); Node nodeList = document.getFirstChild(); printNodeName(nodeList,""); }
public static void printNodeName(Node node,String line){ if(node instanceof Element){ System.out.println(line + node.getNodeName()); } if(node.hasChildNodes()){ NodeList nl = node.getChildNodes(); for(int i =0;i<nl.getLength();i++){ printNodeName(nl.item(i),line+"\t"); } } }
}
二、寫Document到文檔
1.建立Document對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); // 建立一個新的對象
2.建立Dom節點
Element rootEle = doc.createElement("books"); // 建立一個節點 doc.appendChild(rootEle); // 挂到document上,也就是根節點 Element e = doc.createElement("book"); // 再建立一個節點 e.setAttribute("name", "瘋狂java講義"); // 給節點設定屬性 rootEle.appendChild(e); // 把節點添加到建立的節點下
3.把Document寫入到檔案中
TransformerFactory tf = TransformerFactory.newInstance(); Transformer ts = tf.newTransformer(); DOMSource ds = new DOMSource(doc); // 要寫出的資源 PrintWriter pw = new PrintWriter(new File("c.xml")); // 寫出的目的地 StreamResult sr = new StreamResult(pw); // 使用result包裹流 ts.transform(ds, sr);
4.例子(Example)
package xml;
import java.io.File; import java.io.PrintWriter;
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.Document; import org.w3c.dom.Element;
public class Writer {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument(); // 建立一個新的對象 //parse(Writer.class.getClassLoader().getResourceAsStream("config.xml"));
Element rootEle = doc.createElement("books"); doc.appendChild(rootEle); Element e = doc.createElement("book"); e.setAttribute("name", "瘋狂java講義"); rootEle.appendChild(e);
TransformerFactory tf = TransformerFactory.newInstance(); Transformer ts = tf.newTransformer(); DOMSource ds = new DOMSource(doc); // 要寫出的資源 PrintWriter pw = new PrintWriter(new File("c.xml")); // 寫出的目的地 StreamResult sr = new StreamResult(pw); // 使用result包裹流 ts.transform(ds, sr);
}
}
三、讀寫Document
1.建立Document對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( ReadXml.class.getClassLoader().getResourceAsStream("config.xml")); // 加載classpath下的xml檔案生成dom樹
2.對讀取的Document對象進行修改
Element e = doc.getDocumentElement(); // 獲得根節點 Element book = doc.createElement("book"); // 建立一個新節點 book.setAttribute("name", "瘋狂HTML講義"); // 給新的節點設定屬性 e.appendChild(book); // 把新建立的節點添加到根節點下 System.out.println(e.getNodeName()); // 列印根節點的名字
3.将修改後的Document對象寫入到檔案
TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer();
DOMSource xmlSource = new DOMSource(doc); StreamResult sr = new StreamResult(new PrintWriter("d.xml")); t.transform(xmlSource, sr);
4.完整事例
package xml;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList;
public class ReadXml {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(ReadXml.class.getClassLoader().getResourceAsStream("config.xml")); Node nodeList = document.getFirstChild(); printNodeName(nodeList,""); }
public static void printNodeName(Node node,String line){ if(node instanceof Element){ System.out.println(line + node.getNodeName()); } if(node.hasChildNodes()){ NodeList nl = node.getChildNodes(); for(int i =0;i<nl.getLength();i++){ printNodeName(nl.item(i),line+"\t"); } } }
}
四、抽取公共方法
我們發現,每個讀方法中都要進行讀取檔案解析為dom對象,每個寫方法都要把node對象寫入到一個檔案中進行持久化,既然是常用的方法,那麼我們就要對其進行抽取。代碼如下:
package cn.anbow.utils;
import java.io.File;
import java.io.PrintWriter;
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.Document;
import org.w3c.dom.Node;
public class DomUtils {
/**
* 讀取xml檔案轉成dom對象
* @param fileName
* @return
*/
public static Document readXml(String fileName){
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc= builder.parse(new File(fileName));
return doc;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 把dom對象寫入到檔案中
* @param node
* @param filePath
*/
public static void writeXml(Node node,String filePath){
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tf;
try {
tf = factory.newTransformer();
DOMSource ds = new DOMSource(node);
StreamResult sr = new StreamResult(new PrintWriter(filePath));
tf.transform(ds, sr);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
這樣,我們使用java對xml的操作就完成了。