1. 程式人生 > >java DOM 對xml檔案的操作【分別對節點、節點屬性、節點內容增刪改查】

java DOM 對xml檔案的操作【分別對節點、節點屬性、節點內容增刪改查】

最近研究xml檔案  但是書上僅僅是解析 自己有點不滿意 於是在“度娘谷哥”的幫助下蒐集了一些有關於DOM操作xml檔案的資料 並整理下來 也有0分的原始碼供大家下載

DOM是W3C組織推廣的一中操作xml檔案的方法,也是java原生態操作xml檔案的方法之一,DOM的優點就是操作xml檔案簡單,可以重複隨便的增刪改查,但是不足的是,在操作前需要把整個xml檔案以樹狀圖載入到記憶體中,這樣的話會影響程式的執行效率,所以,小的xml檔案用DOM才是不錯的選擇

被操作的xml檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<clazz>
    <student sn="01">
        <name>張三</name>
        <age>18</age>
    </student>
    <student sn="02">
        <name>李四</name>
        <age>20</age>
    </student>
    <student sn="03">
        <name>王五</name>
        <age>20</age>
    </student>
</clazz>

xml檔案與專案的路徑關係如下:


問題:
【節點的增、刪、改、查】
1、在根節點下增加一個<student>節點,新增屬性sn值為04,<student>節點下有<name>、<age>節點節點內容分別為name=趙六,age=21(節點的增加)
2、在根節點下找到屬性sn為02的<student>節點,並輸出該節點下的姓名,年齡(節點的查詢)
3、在根節點下找到屬性sn為03的<student>節點,並刪除該節點(節點的刪除)
4、在根節點下找到屬性sn為01的<student>節點,並把<student>節點修改為<teacher>(節點的修改)
【節點屬性的增、刪、改、查】
1、在sn=01的節點上增加屬性type=班長
2、刪除sn=02的sn屬性
3、修改sn=03的sn屬性為05
4、查詢......(上面的都用到了)
【節點內容的增、刪、改、查】
(其中的增與刪沒必要,因為增加就是改,刪除也是改,刪除也可以直接刪除節點,所以只有改和查有意義)
1、查詢sn=01的同學姓名
2、修改sn=02的同學姓名為王二

1、獲取Document物件:

Document就是xml檔案的“樹狀圖”,獲取Document物件需要通過工廠類去獲取,下面的方法會返回一個Document對像,

public Document createDocument(){
		
	Document document = null;
		
	try {
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		FileInputStream  xmlInputStream = new FileInputStream("xmlFile/clazzXml.xml");
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
			
		document = builder.parse(xmlInputStream);
			
	} catch (ParserConfigurationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SAXException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
		
	return document;
		
}

2、獲取根節點:

獲取xml的根節點可以通過Document中的getDocumentElement()方法:

Element root = document.getDocumentElement();

3、遍歷xml檔案:
public void domXML(Document document){
		
	Element root = document.getDocumentElement();
	System.out.println("xml檔案的根節點為:"+root.getNodeName());
	System.out.println();
	NodeList stuNodeList = root.getChildNodes();
		
	for(int i = 0;i < stuNodeList.getLength();i ++){
			
		Node stuInforNode = stuNodeList.item(i);
		if(stuInforNode.getNodeType() == Node.ELEMENT_NODE){
				
			NodeList stuNode = stuInforNode.getChildNodes();
			for(int j = 0;j < stuNode.getLength();j ++){
					
				Node stuNode2 = stuNode.item(j);
				if(stuNode2.getNodeName().equals("name")){
					System.out.println("姓名:"+stuNode2.getTextContent());
				}
				else if(stuNode2.getNodeName().equals("age")){
					System.out.println("年齡:"+stuNode2.getTextContent());
				}
				
			}
				
		}
			
	}
		
}

4、為指定節點下新增子節點:

//	1、在根節點下增加一個<student>節點,新增屬性sn值為04,
//	<student>節點下有<name>、<age>節點節點內容分別為name=趙六,age=21(節點的增加)
	public void addElement(Document document){
		
		Element root = document.getDocumentElement();
		
		//解決問題步驟1、建立節點 建立屬性 建立內容 2、寫入內容 寫入屬性 寫入節點
		//1、建立
		//建立students節點以及students下的name節點與age節點
		Element stuEle = document.createElement("student");
		Element nameEle = document.createElement("name");
		Element ageEle = document.createElement("age");
		//建立name與age內容
		Text nameText = document.createTextNode("趙六");
		Text ageText = document.createTextNode("21");
		//建立student節點屬性sn=04
		Attr stuAttr = document.createAttribute("sn");
		stuAttr.setValue("04");
		
		//2、寫入
		//寫入屬性
		stuEle.setAttributeNode(stuAttr);
		//把name、age寫入student下
		stuEle.appendChild(nameEle);
		stuEle.appendChild(ageEle);
		//寫入內容
		nameEle.appendChild(nameText);
		ageEle.appendChild(ageText);
		//把student寫入根節點下
		root.appendChild(stuEle);
		
		
	}

該方法可以增加xml檔案的節點 但是 程式執行後 開啟xml檔案 xml並沒有改變 這好似因為我們並沒有把修改過的xml重新寫入到檔案中 重新寫入xml要使用Transformer物件

5、Transformer物件的獲取 與儲存修改過的xml檔案

//儲存xml檔案
	public void saveXml(Document document){
		
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		try {
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource domSource = new DOMSource(document);
			StreamResult streamResult = new StreamResult(new FileOutputStream("xmlFile/clazzXml.xml"));
		    
			transformer.transform(domSource, streamResult);
			
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

這樣,加入修改過的Document物件 就會把修改過的xml檔案儲存

關於文章開頭問題中剩下的操作請點選下面的連線下載原始碼