天天看點

xml-03-Java操作XML

一、遞歸周遊整個文檔

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的操作就完成了。

xml