1. 程式人生 > >java中的xml解析---------DOM解析

java中的xml解析---------DOM解析

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);
			}
		}