1. 程式人生 > >Java---DOM解析XML文件詳解例項

Java---DOM解析XML文件詳解例項

文件物件模型(Document Object Model,簡稱DOM)
package cn.hncu.dom;

import java.io.File;

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.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomDemo1 {
	@Test
	// 需求:把第一個user節點的name的值取出來
	public void getDom() throws Exception {
		// 第一步,通過DocumentBuilderFactory類中的工廠方法等到一個dbf物件
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 第二步,通過dbf物件創建出一個DocumentBuilder物件
		DocumentBuilder db = dbf.newDocumentBuilder();
		// 第三步,通過db物件創建出一個Document物件
		Document dom = db.parse("./WebRoot/xml4/users.xml");// new File("./xml4/users.xml")
		System.out.println("dom:" + dom);

		// 然後進行dom操作
		Node root = dom.getFirstChild();
		System.out.println("root:" + root);
		System.out.println(root.getNodeName());
		System.out.println(root.getFirstChild().getNodeName());
		// 上面一句的輸出是:#text ----dom中把空白符也看成是一個Node,這種情況對我們的解析通常會造成很大的麻煩
		// ※※為解決上面的問題,我們以後解析時儘量不要用Node,而要用Element。
		// 因為Element是元素它不包含屬性和文字內容(包括空白符),因此可避開空白符的干擾

		Element eRoot = (Element) root;
		NodeList list = eRoot.getElementsByTagName("user");
		System.out.println("user元素的數量:" + list.getLength());
		System.out.println("第1個user元素" + list.item(0));// 通過item(index)來獲取列表中的元素
		System.out.println("第2個user元素" + list.item(1));

		
		//讀取XML文件裡面的“name,jack";
		Node userNode = list.item(0);
		Element eUser1 = (Element) userNode;//要把Node強轉成Element,因為Element是子介面,裡面有getElementBy*等方法,而Node沒有(只能採用childNodes的方式,這種方式會受空白符的干擾)
		NodeList listNames = eUser1.getElementsByTagName("name");
		String nm=listNames.item(0).getNodeName();//name--標籤名
		String nmVal=listNames.item(0).getTextContent();//標籤內部所包含的文字內容----innerText
		System.out.println(nm+","+nmVal);
	}
	@Test //需求:把第二個user節點的age值取出來
	public void getAge()throws Exception{
		// 第一步,通過DocumentBuilderFactory類中的工廠方法等到一個dbf物件
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		// 第二步,通過dbf物件創建出一個DocumentBuilder物件
		DocumentBuilder db = dbf.newDocumentBuilder();
		// 第三步,通過db物件創建出一個Document物件
		Document dom = db.parse(new File("./WebRoot/xml4/users.xml")); 
		// 然後進行dom操作
		Element root=(Element) dom.getFirstChild();
		Element user2=(Element) root.getElementsByTagName("user").item(2);
		Element eAge =(Element) user2.getElementsByTagName("age").item(0);
		String age = eAge.getTextContent();
		System.out.println("age:"+age);
	}
	//用Java對xml文件進行CRUD---建立,遍歷,更新,刪除
	//遍歷
	@Test
	public void query() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = factory.newDocumentBuilder();
		Document dom = db.parse( new File("./WebRoot/xml4/users.xml") );
		Element root = (Element) dom.getFirstChild();
		NodeList list = root.getElementsByTagName("user");
		for(int i=0;i<list.getLength();i++){
			Element user =(Element) list.item(i);
			String id = user.getAttribute("id");
			String name = user.getElementsByTagName("name").item(0).getTextContent();
			String age = user.getElementsByTagName("age").item(0).getTextContent();
			System.out.println("id:"+id+",name:"+name+",age:"+age);
			System.out.println("-----------------------");
		}
		
	}
	//更新---把最後一個user的年齡+10
		@Test
		public void update() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = factory.newDocumentBuilder();
			Document dom = db.parse( new File("./WebRoot/xml4/users.xml") );
			Element root = (Element) dom.getFirstChild();
			
			//Element eUser = (Element) root.getLastChild();//注意bug:如果最後一個</user>和</users>標籤之前有空白符(包括換行),那麼該句獲得的節點是空白符
			//System.out.println(root.getLastChild().getNodeName());//#text
			NodeList list =  root.getElementsByTagName("user");
			Element eUser = (Element) list.item(list.getLength()-1);
			Element eAge = (Element) eUser.getElementsByTagName("age").item(0);
			int age = Integer.parseInt(eAge.getTextContent().trim())+10;
			eAge.setTextContent(""+age);
			System.out.println(age);
			
			//把記憶體中的當前dom物件儲存到xml檔案
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer trans = tf.newTransformer();
			trans.transform(new DOMSource(dom), new StreamResult("./WebRoot/xml4/users.xml"));//把xml源 輸出到 目標 ---如果目標存在則是更新,否則是建立
		}
		
		//建立 --需求:新增一個新的user
		@Test
		public void create() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = factory.newDocumentBuilder();
			Document dom = db.parse( new File("./WebRoot/xml4/users.xml") );
			Element root = (Element) dom.getFirstChild();

			//建立一個新的user元素
			Element eUserNew = dom.createElement("user");
			eUserNew.setAttribute("id", "C001");
			//建立name和age子元素
			Element eName = dom.createElement("name");
			eName.setTextContent("李四");
			Element eAgeNew = dom.createElement("age");
			eAgeNew.setTextContent("22");
			//把所建立的元素組裝成一棵子樹,新增到整棵dom樹上
			eUserNew.appendChild(eName);
			eUserNew.appendChild(eAgeNew);
			root.appendChild(eUserNew);
			
			//把記憶體中的當前dom物件儲存到xml檔案
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer trans = tf.newTransformer();
			trans.transform(new DOMSource(dom), new StreamResult("./WebRoot/xml4/users.xml"));//把xml源 輸出到 目標 ---如果目標存在則是更新,否則是建立
		}
		
		//刪除---需求:刪除最後一個元素
		@Test
		public void delete() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = factory.newDocumentBuilder();
			Document dom = db.parse( new File("./WebRoot/xml4/users.xml") );
			Element root = (Element) dom.getFirstChild();
			
			//獲取將要刪除的元素
			NodeList list = root.getElementsByTagName("user");
			Element e = (Element) list.item( list.getLength()-1 );
			e.getParentNode().removeChild(e);
			
			//把記憶體中的當前dom物件儲存到xml檔案
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer trans = tf.newTransformer();
			trans.transform(new DOMSource(dom), new StreamResult("./WebRoot/xml4/users.xml"));
		}
	
}

<?xml version="1.0" encoding="UTF-8" standalone="no"?><users>
  <user id="A001">
     <name>Jack</name>
     <age>25</age>
  </user>
  <user id="A002">
     <name>張三</name>
     <age>80</age>
  </user>
  <user id="B001">
     <name>Rose</name>
     <age>28</age>
  </user>
 <user id="C001">
 	<name>李四</name>
	<age>22</age>
	</user><user id="C001">
		<name>李四</name>
		<age>32</age>
		</user>
		</users>

相關推薦

Java---DOM解析XML例項

文件物件模型(Document Object Model,簡稱DOM)package cn.hncu.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml

XML以及解析

不同 enume repl 添加 data 的人 中間 load 包含 一、xml基礎詳解: 1、概述: xml:即可擴展標記語言,xml是互聯網數據傳輸的重要工具,它可以跨越互聯網任何的平臺,不受編程語言和操作系統的限制,可以說它是一個擁有互聯網最高級別通行證的數

筆記:MyBatis Mapper XML - 映射和參數

gin server 頂級 ctp columns ref acl 目標 對象傳遞 MyBatis 的真正強大在於它的映射語句,也是它的魔力所在。由於它的異常強大,映射器的 XML 文件就顯得相對簡單。如果拿它跟具有相同功能的 JDBC 代碼進行對比,你會立即發現省掉了將近

web.xml

空指針異常 異常 ava param script clas 基本配置 version dex web.xml文件詳解 前言:一般的web工程中都會用到web.xml,web.xml主要用來配置,可以方便的開發web工程。web.xml主要用來配置Filter、Lis

MyBatis之Mapper XML (二)-sql和入參

java mybatis sql 參數 mapper sql這個元素可以被用來定義可重用的 SQL 代碼段,可以包含在其他語句中。它可以被靜態地(在加載參數) 參數化. 不同的屬性值通過包含的實例變化. 比如:<sql id="userColumns"> $

MyBatis之Mapper XML (五)-自動映射查詢結果

java mybatis 正如你在前面一節看到的,在簡單的場景下,MyBatis可以替你自動映射查詢結果。 如果遇到復雜的場景,你需要構建一個result map。 但是在本節你將看到,你也可以混合使用這兩種策略。 讓我們到深一點的層面上看看自動映射是怎樣工作的。 當自動映射查詢結果時,MyBatis

MyBatis之Mapper XML (六)-緩存配置

java mybatis MyBatis 包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實現的很多改進都已經實現了,使得它更加強大而且易於配置。 默認情況下是沒有開啟緩存的,除了局部的 session 緩存,可以增強變現而且處理循環 依賴也是必須的。要開啟二級

mybatis-config.xml

http ati handle ins java database vid user dot 1. 屬性列表 Mybatis的配置文件中包含了影響mybatis行為的設置(settings)和屬性(properties)信息。文檔的頂層結構如下: ·con

微擎模塊開發manifest.xml

微擎微擎在安裝或卸載模塊時會根據manifest.xml生成(或刪除)數據庫中相應記錄,並執行manifest.xml裏指定的腳本。<application setting='true'> <name><![CDATA[壹應用]]></name>

使用DOM解析xml

class onf get 1.0 sax elements div dom stat 使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Languages cat="it

MyBatis之Mapper XML (四)-JDBC 類型和嵌套查詢

調用 表格 outer model sele 復雜 普通 全局配置 當前 支持的 JDBC 類型為了未來的參考,MyBatis 通過包含的 jdbcType 枚舉型,支持下面的 JDBC 類型。 BITFLOATCHARTIMESTAMPOTHERUNDEFINEDTINY

Mybatis的mapper.xml

高級 null ted ofo 延遲 輸入參數 文件 通過 pac 1、#{}和${}的區別: #{}表示一個占位符號,#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap。 如果接收簡單類型,#{}中可以寫成value或其它名稱。

Tomcat的server.xml

between keystore stand roc virtual source enc toc pri 這個文件平時一般多用於修改端口號和訪問路徑 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!--

DOM解析XML例項之學生管理系統

/** *@ author StormMaybin *@ date 2016-10-06 */ 生命不息,奮鬥不止! 需求分析: 用XML文件來儲存學生資訊, 通過對XML文件的增刪改,來實現管理學生資訊的功能。 主體結構

java解析xml練習——通過應用包名獲取應用圖標即其他信息(基於魅族應用商店)

fin vma tdm row con smartd enter music close 1、解析包名數據文件(txt文件),並生成包名數組: package jsouphtml; import java.io.BufferedReader; import j

java項目中怎樣利用Dom4j解析XML獲取數據

avi conf get 自己 mar dom4j eas localhost b2c 在曾經的學習.net時常常會遇到利用配置文件來解決項目中一些須要常常變換的數據。比方數據庫的連接字符串兒等。這個時候在讀取配置文件的時候。我們一般會用到一個雷configuratio

spring applicationContext.xml 配置

Coding true 上下文 wait bsp aspectj 容器 ebe lis applicationContext.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht

Dom方法,解析XML

content clas style 對象 物理文件 數據源 class 讀取 輸出 Dom方法,解析XML文件的基本操作 1 package com.demo.xml.jaxp; 2 3 import java.io.IOException; 4 5 im

mycat schema.xml 配置

ble b- 初始化 mas 拆分 item sele mon sequoiadb <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema

java基礎 xml 使用dom4j解析 xml servlet根據pattern 找到class

col demo gpo string java OS pattern mapping unit package com.swift.kaoshi; import java.io.File; import java.util.List; import java.util