學習筆記(四)XML

xml(可擴張標誌語言)

xml應用分類
  • 應用於客戶需要與不同數據源進行交互
  • 應用於將大量運算負荷分佈在客戶端
  • 應用於將同一數據以不同的面貌展現給不同的用戶
  • 應用與內容與配置管理

xml只用元素和屬性來描述數據,而怒提供數據的顯示方法

xml的基本結構

xml即一個以.xml爲後綴的文件,包括:

  • xml聲明
  • xml元素描述
<?xml version="1.0" encoding="utf-8" ?>
<books>
	<book>
		<name>Java</name>
		<author>zhang san</author>
	</book>
	<book>
		<name>C#</name>
		<author>li si</author>
	</book>
</books>
  • xml聲明
版本聲明: <?xml version="1.0"?>
編碼聲明: <?xml version="1.0" encoding="utf-8" ?>
獨立聲明: <?xml version="1.0" encoding="utf-8" standalone="yes"?>

版本聲明: version : 解析這個xml的時候,使用什麼版本的解析器解析
編碼聲明:encoding : 解析xml中的文字的時候,使用什麼編碼來翻譯(utf-8,gbk,gb2312)
獨立聲明:standalone : no - 該文檔會依賴關聯其他文檔 , yes-- 這是一個獨立的文檔

  • xml元素
    xml元素命名規則
    名稱可以含字母、數字以及其他的字符
    名稱不能以數字或者標點符號開始
    名稱不能以字符 “xml”(或者 XML、Xml)開始
    名稱不能包含空格
    可使用任何名稱,無保留的字詞
    * 好名稱應具有描述性,能見名知意
  • CDATA
    由於xml解釋器通常會解釋xml文檔中的所有文本。非法字符【“<”、"&"】而省略號、引號和大於號是合法,但把他們替換爲實體引用是個好習慣
&lt < 小於
&gt > 大於
&amp & 和號
&apos ’ 省略號
&quot " 引號

如不希望文本被解釋器解釋,則可以將文本放在CDATA標誌中
CDATA:以“<![CDATA[” 開始,以 “]]>”結束

<ah> <![CDATA[<a href="http://www.baidu.com">百度一下</a>]]> </ah>

*CDATA的“]]>”結束部分不包含空格或拆行

  • xml註釋
<!-- 這裏是註釋內容 -->

xml的註釋,不允許放置在文檔的第一行。 必須在文檔聲明的下面。

DTD與XML Schema

  • DTD[Document Type Definition]用來定義xml文檔結構,包括:

元素的定義規則
元素間關係的定義規則
元素可使用的屬性
可使用的實體或符號規則

DTD在xml文檔內聲明

 <!DOCTYPE 根元素 [元素聲明]>

帶有 DTD 的 XML 文檔實例

<?xml version="1.0"?>
<!DOCTYPE books [
  <!ELEMENT books (book)>
  <!ELEMENT book (name,author)>
  <!ELEMENT name    (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
]>
<books>
	<book>
		<name>Java</name>
		<author>zhang san</author>
	</book>
</books>
<!ELEMENT books (book)>:books下有隻有一個元素book。 <!ELEMENT book (name,author)>:book下有兩個元素name,author且順序必爲name - author

元素的個數:
+:一個或多個
*:零個或多個
?:零個或一個
屬性的類型定義
CDATA : 屬性是普通文字
ID : 屬性的值必須唯一

<!ELEMENT stu (name , age)> 按照順序來
<!ELEMENT stu (name | age)> 兩個中只能包含一個子元素

PCDATA即被解析的字符數據(parsed character data)。

PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。

CDATA 即字符數據(character data)。

CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開。

  • XML Schema

XML Schema:
– 定義可出現在文檔中的元素
– 定義可出現在文檔中的屬性
– 定義哪個元素是子元素
– 定義子元素的次序
– 定義子元素的數目
– 定義元素是否爲空,或者是否可包含文本
– 定義元素和屬性的數據類型
– 定義元素和屬性的默認值以及固定值

<?xml version="1.0"?>
<!-- xmlns :xml namespace:命名空間
	targetNamespace:目標命名空間
	elementFormDefault:元素格式化情況
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.example.org/book"
	elementFormDefault="qualified">
<element name="book">
    <complexType>
      <sequence>
		<element name="name" type="xs:string"/>
		<element name="author" type="xs:string"/>
      </sequence>
    </complexType>
</element>
</schema>

<?xml version="1.0"?>
<!-- xmlns :xml namespace:命名空間
	targetNamespace:目標命名空間
	elementFormDefault:元素格式化情況
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.example.org/book"
	elementFormDefault="qualified">
	
<element name="books">
    <complexType>
          <sequence>
			<element name="book">
   				 <complexType>
      				<sequence>
						<element name="name" type="xs:string"/>
						<element name="author" type="xs:string"/>
     				 </sequence>
   				 </complexType>
			</element>
   		</sequence>
   	</complexType>
</element>
</schema>

Java解釋xml

  • DOM(文檔對象模型)

    需要對文件進行修改
    需要對文件進行隨機修改

  • SAX <事件驅動的>

對大型文件進行處理
只需修改文件夾部分內容,或只需從文件中得到特定信息
想建立自己的對象模型
###Dom4j 基本用法

	element.element("book") : 返回該元素下的第一個book元素
	element.elements(); 返回該元素下的所有子元素。 
  1. 創建SaxReader對象

  2. 指定解析的xml

  3. 獲取根元素。

  4. 根據根元素獲取子元素或者下面的子孫元素

     try {
     	//1. 創建sax讀取對象
     	SAXReader reader = new SAXReader(); //jdbc -- classloader
     	//2. 指定解析的xml源
     	Document  document  = reader.read(new File("src/xml/books.xml"));
     	
     	//3. 得到元素、
     	//得到根元素
     	Element rootElement= document.getRootElement();
     	
     	//獲取根元素下面的子元素 author
     //rootElement.element("author") 
     	//System.out.println(rootElement.element("book").element("author").getText());
    
    
     	//獲取根元素下面的所有子元素 。 book元素
     	List<Element> elements = rootElement.elements();
     	//遍歷所有的book元素
     	for (Element element : elements) {
     		//獲取stu元素下面的name元素
     		String name = element.element("name").getText();
     		String age = element.element("author").getText();
     		System.out.println("name="+name+"==author+"+author);
     	}
     	
     } catch (Exception e) {
     	e.printStackTrace();
     }
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章