java DOM 對xml檔案的操作【分別對節點、節點屬性、節點內容增刪改查】
阿新 • • 發佈:2018-12-26
最近研究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檔案儲存
關於文章開頭問題中剩下的操作請點選下面的連線下載原始碼