java中的xml解析---------DOM解析
阿新 • • 發佈:2018-12-04
1.什麼是xml?
xml是可擴充套件標記語言的縮寫,是一種簡單的資料儲存語言,使用一系列的標記來描述資料。
2.xml的特點
xml使用於作業系統無關,規範統一。
3.xml宣告
<?xml version="1.0 encoding="utg-8"?>
version:文件複合xml1.0的規範
encoding:文件預設字元編碼,預設為utf-8.
4.xml中的標籤是成對出現,xml檔案可以包含任意數量的標籤。
5.xml文件的使用規則:
- 必須有xml宣告語句。
- 必須且只有一個根元素
- 標籤的大小寫敏感,就是區分大小寫
- 屬性值用雙引號包含起來
- 標籤成對出現
- 元素正確巢狀
- 元素名稱不能出現空格,不能以數字或者標點符號開頭。
6.使用DOM解析XML文件
DOM是基於xml的數結構來完成解析的。
特點:比較消耗資源。
dom是文件物件模型的簡稱,以根元素為節點,每個節點都是以物件的形式存在。
解析程式碼如下:
public class Test { public static void main(String[] args) throws Exception { //1.獲得解析器工廠 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //2.獲得解析器物件 DocumentBuilder builder =factory.newDocumentBuilder(); //3.解析xml檔案 Document doc=builder.parse("src/info.xml"); //根據標籤內容獲得所有的元素節點資訊 NodeList brandNodeList=doc.getElementsByTagName("Brand"); //迴圈遍歷 for (int i = 0; i < brandNodeList.getLength(); i++) { Node brandNode=brandNodeList.item(i); //獲得節點 Element brandEle=(Element) brandNode; //強制型別轉換,將節點轉換為元素 String brandAttr=brandEle.getAttribute("name"); //獲得元素對應的屬性值 NodeList type=brandEle.getChildNodes(); for (int j = 0; j < type.getLength(); j++) { Node typeNode=type.item(j); if(typeNode.getNodeType()==Element.ELEMENT_NODE) { Element typeEle=(Element)typeNode; String typeName=typeEle.getAttribute("name"); System.out.println("品牌:"+brandAttr+",型號:"+typeName); } } } } } //注意:Document物件代表整個xml文件,所有的節點都是以一定的順序包含在Document物件以內。
Document物件的主要方法:
- getElementsByTagName(String name):返回的是一個NodeList物件,包含所有的標籤名稱。
- getDocumentElement():返回的是這個Dom樹的根節點的Element物件,也就是這個根元素的物件。
NodeList物件:
- getLength():返回列表的長度。
- item(int index):返回指定位置的Node物件
Node物件:
- getChildNodes():包含所有的子節點的集合。
- getFirstChild():如果節點存在子節點,那麼返回第一個子節點
- getLastChild():如果節點存在子節點,那麼返回最後一個子節點
- getNodeName():返回節點的名稱
- getNodeValue():返回節點的值。
- getNodeType():返回節點的型別。
新增新節點程式碼如下:
public class Test2 {
public static void main(String[] args) throws Exception {
// 1.獲得解析器工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.獲得解析器物件
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml檔案
Document doc = builder.parse("src/info.xml");
//新增子節點
//1.建立Brand節點,也就數建立新元素
Element brandEle=doc.createElement("Brand");
//2.為新建立的元素新增文字和屬性
brandEle.setAttribute("name", "oppo手機");
brandEle.setTextContent("充電5分鐘,通話1小時!");
//將這個元素新增到dom樹中
// Element root=doc.getElementById("ID");
Element oppo=(Element) doc.getElementsByTagName("PhoneInfo").item(0);
//父節點追加子節點
oppo.appendChild(brandEle);
//將記憶體中dom樹儲存到XML檔案
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
DOMSource domsource=new DOMSource(doc); //關聯原本的dom樹
transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result=new StreamResult(new FileOutputStream("src/chap06/info.xml"));
//將dom樹轉換成xml檔案
transformer.transform(domsource, result);
}
}
修改節點:
public class Test3 {
public static void main(String[] args) throws Exception {
// 1.獲得解析器工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.獲得解析器物件
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析xml檔案
Document doc = builder.parse("src/chap06/info.xml");
//修改元素
//先找到要修改的元素
NodeList list=doc.getElementsByTagName("Brand");
for(int i=0;i<list.getLength();i++) {
Node brandNode=list.item(i); //遍歷迴圈,拿到每一個節點元素
Element brandEle=(Element) brandNode;
String brandAttr=brandEle.getAttribute("name");
//判斷,如果說獲得到的子節點是蘋果,那麼就修改
if(brandAttr.equals("蘋果")) {
//修改:將找到的元素節點修改成apple
brandEle.setAttribute("name","apple");
}
}
//將記憶體中dom樹儲存到XML檔案
//解析器工廠
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();//解析器物件
DOMSource domsource=new DOMSource(doc); //記憶體中原來的dom樹
transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");//設定編碼格式
transformer.setOutputProperty(OutputKeys.INDENT, "yes");//設定在輸出內容的時候格式化
StreamResult result=new StreamResult(new
FileOutputStream("src/chap06/info.xml"));//儲存該文件
//將dom樹轉換成xml檔案
transformer.transform(domsource, result);
}
}
刪除節點:
//刪除元素
//先找到要刪除的元素
NodeList list=doc.getElementsByTagName("Brand");
for(int i=0;i<list.getLength();i++) {
Node brandNode=list.item(i); //遍歷迴圈,拿到每一個節點元素
Element brandEle=(Element) brandNode;
String brandAttr=brandEle.getAttribute("name");//拿到屬性值的名字
//判斷,如果說獲得到的子節點是apple,那麼就去刪除
if(brandAttr.equals("apple")) {
//刪除:通過父節點去刪除自己,也就是子節點
brandEle.getParentNode().removeChild(brandNode);
}
}