XML語言介紹、XML約束、和解析XML語言的幾種方式。

1、XML定義

1.一、XML介紹

Extensible Markup Language 可擴展的標記語言.XML技術是W3C組織發佈的,目前推薦遵循的是W3C組織於2000年發佈的XML1.0規範。在現實生活中大量存在有關係的數據。能夠經過XML技術來描述這些關係數據。在XML語言中,它容許用戶自定義標籤。一個標籤用於描述一段數據:一個標籤可分爲開始標籤和結束標籤。在開始標籤和結束標籤之間又可使用其它標籤描述其它數據。node

<中國>
	<北京>
		<海淀></海淀>
		<豐臺></豐臺>
	</北京>
	<杭州>
		<西湖></西湖>
		<濱江></濱江>
	</杭州>
</中國>

1.二、XML使用場景

  • 保存有關係的數據
  • 軟件配置文件(描述程序之間的關係)

2、XML語法

2.一、XML語法組成

  • 文檔聲明
<!--standalone:是不是獨立的文檔。-->
<!--在xml中,空格和換行都做爲原始內容被處理。-->
<!--不要出現中文全角空格。-->
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  • 元素
<!--包含標籤體-->
<a>內容</a>

<!--不包含標籤體-->
<a/>

<!--嵌套標籤,不容許交叉嵌套。-->
<a>
	<b>內容2</b>
</a>

<!--XML文檔只能有一個根標籤。-->
<soft>
	<c></c>
	<d></d>
</soft>

<!--對於XML標籤中出現的全部空格和換行,XML解析程序都會看成標籤內容進行處理。-->
<網址>
	www.163.com
</網址>
  • 屬性
<!--XML屬性的定義。-->
<demo name="text"></demo>

<!--也可使用標籤嵌套的方式來使用屬性。-->
<demo>
	<name>text</name>
</demo>
  • 註釋
<!-- 註釋 -->
<!--XML聲明以前不能有註釋-->
<!--註釋不能嵌套-->
  • CDATA區、特殊字符

 

  • 處理指令(processing instruction)

2、XML約束

一、要用必定的規範來約束XML語言,按照自定義規範來編寫XML文檔。app

二、XML約束技術:XML DTD 和 XML Schema技術。dom

3、XML約束:(DTD約束)

一、DTD(Document Type Definition文檔類型定義) book.dtd性能

<!--元素定義:ELEMENT
	書架 (書+):括號裏放入元素名稱
	書架  ANY:括號裏放入元素類型ANY標識任何類型
	書 (書名,做者,售價):用逗號分割,表示內容的出現順序必須與聲明時一致
	書 (書名|做者|售價):用|分割,表示任選其一,即多個只能出現一個
	書+:一次或屢次
	書?:0次或一次
	書*:0次或屢次
	書:必須出現一次
 -->
 <!ELEMENT 書架 (書+)> <!-- 中間空格不可缺 -->
<!ELEMENT 書 (書名,做者,售價)>
<!ELEMENT 書名 (#PCDATA)><!-- #PCDATA:字符串 -->
<!ELEMENT 做者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>

<!--爲元素設置屬性-->
<!--爲標籤配置屬性定義
	經過 ATTLIST 元素設置屬性
	屬性名 
	屬性值類型(CDTAT:字符串,ENUMERATED:枚舉,ID,ENTITY:實體) 
	設置說明(#REQUIRED:必須的。#IMPLIED:能夠設置也能夠不設置。#FIXED:固定值)
	
	<!ATTLIST 元素名
	姓名 字符串 可選的
	年齡 CDATA 可選的
	聯繫信息 CDATA 必須的
	網站職務 CDATA 固定值 提供的固定值
	我的愛好 CDATA 直接使用默認值
>
-->

<!ATTLIST 做者
	姓名 CDATA #IMPLIED
	年齡 CDATA #IMPLIED
	聯繫信息 CDATA #REQUIRED
	網站職務 CDATA #FIXED "CTO"
	我的愛好 CDATA "ABC"
>

二、book.xml就能夠按照dtd文件元素定義的約束規範來寫了。網站

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 書架 SYSTEM "book.dtd">

<書架>
	<書>
		<書名>Spring攻略第二版</書名>
		<做者  聯繫信息="110">Gary Mak Josh Long</做者>
		<售價>100元</售價>
	</書>
	<書>
		<書名>JavaWeb開發</書名>
		<做者  聯繫信息="110">方立勳</做者>
		<售價>80元</售價>
	</書>
	
</書架>

 

4、XML解析和DOM、SAX解析原理(XML解析開發包:Jaxp(官方API),Jdom,dom4j(性能最好))

  1. DOM解析方式 ui

/**spa

* DOM解析方式(文檔對象模型 W3C標準) :code

* DOM解析會把整個文檔放入直接放入內存裏(以對象樹的方式)orm

*     1.把每一個節點變成Element對象xml

*     2.把每一個屬性變成Attribute對象

*     3.把每一個文本變成Text對象

* 優勢:對文檔的增刪改查比較容易。

* 缺點:若是文檔比較大,內存就會溢出。

* 在DOM解析下,xml文檔的每個組成部分都會用對象來表示,如:標籤名用Element,屬性名用Attribute

* 可是無論什麼對象,都是Node(節點對象)的子類,在開發中獲取的任意節點均可以當作Node來使用。

*/

/**
	 * DOM解析:使用jaxp方式(性能最差)
	 * 獲取某個節點下的文本值
	 * @throws Exception 
	 */
	@Test
	public void testJaxp1() throws Exception{
		//1.建立工廠
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.獲取DOM對象樹的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文檔,獲取表明文檔的Document對象
		Document document = documentBuilder.parse("src/book.xml");
		//4.獲取指定標籤名的元素,返回一個集合
		NodeList nodeList = document.getElementsByTagName("書名");
		//5.獲取nodeList下指定的元素
		Node node = nodeList.item(1);
		//6.獲取元素下的文本值
		String content = node.getTextContent();
		//7.打印
		System.out.println(content);
		
	}
	
	/**
	 *DOM解析:使用jaxp方式(性能最差) 遍歷全部的節點(遞歸)
	 * @throws Exception
	 */
	@Test
	public void testJaxp2() throws Exception{
		//1.建立工廠
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.獲取DOM對象樹的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文檔,獲取表明文檔的Document對象
		Document document = documentBuilder.parse("src/book.xml");
		//4.獲取根節點(根節點只有一個)
		NodeList nodeList = document.getElementsByTagName("書架");
		Node node = nodeList.item(0);
		
		list(node);
		
	}
	
	private void list(Node node) {
		
		if(node instanceof Element){
			System.out.println(node.getNodeName());
		}
		
		//1.獲得當前根節點下的全部子節點
		NodeList nodeList = node.getChildNodes();
		//2.遍歷全部的子節點
		for (int i = 0; i <nodeList.getLength(); i++) {
			//3.若是當前子節點還有子節點,獲取子節點的子節點
			Node child = nodeList.item(i);
			//4.遞歸
			list( child );
		}
	}

	
	//獲得標籤下的某個屬性值
	@Test
	public void testJaxp3() throws Exception{
		//1.建立工廠
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.獲取DOM對象樹的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文檔,獲取表明文檔的Document對象
		Document document = documentBuilder.parse("src/book.xml");
		//4.獲取指定標籤名的元素,返回一個集合(在這裏咱們知道做者這個標籤是Element元素才進行強轉)
		Element element = (Element) document.getElementsByTagName("做者").item(0);
		//5.獲取屬性值
		String content = element.getAttribute("聯繫信息");
		//6.打印
		System.out.println(content);
		
	}
	//添加節點
	@Test
	public void testJaxp4() throws Exception{
		//1.建立工廠
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		//2.獲取DOM對象樹的解析器
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		//3.解析XML文檔,獲取表明文檔的Document對象
		Document document = documentBuilder.parse("src/book.xml");
		//4.建立標籤
		Element priceElement = document.createElement("售價");
		//5.爲標籤體設置內容
		priceElement.setTextContent("59");
		//6.獲得新建立的標籤想要添加的位置
		Node book = document.getElementsByTagName("書").item(0);
		//7.添加新建立的標籤
		book.appendChild(priceElement);
		//8.把更新後的內存中的document對象樹從新寫回xml文檔裏
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		Source xmlSource = new DOMSource(document);
		transformer.transform(xmlSource, new StreamResult(new FileOutputStream("src/book.xml")));

	}
相關文章
相關標籤/搜索