详解xml
xml
xml簡介
XML是一種可擴展標記語言 (Extensible Markup Language, XML)。是一種可擴展的標記語言,XML重在數據交換,用于不同平臺或者應用程序之間交換數據,存儲數據。
版本:XML1.0版本(使用) XML1.1版本(不向下兼容)
1:XML是純文本標記
XML文件是純文本的形式,正是由于這種簡單的格式,才讓所有能處理純文本的程序都能處理XML文件。這樣對于數據交換和傳輸時至關重要的,也提高了它的兼容性和與平臺無關性。
2:XML可以隨意的定義自己的標簽
你可以以任意文字定義標簽,只要有開始符號和結束符號,只要符合XML的樹形結構就可以,甚至可以使用中文。
3:與HTML的區別
XML重在存儲數據,html重在顯示數據。它們都是標記語言,但是html的標記是死的。xml的標記是活的。 如:新浪天氣預報接口
4:XML是沒有行為的
這句話的意思就是XML只能放在文件里面等著別人去讀取,寫入。自己本身沒有執行的能力。
5.作為框架的配置文件(Struts2 Spring Hibernate)
xml語法
文檔聲明(重點)
* 文檔聲明:聲明當前的這個文件就是一個XML文件。必須要出現的。
* 寫法: <?xml version="1.0" ?>
* 需要出現在xml文檔中的第一行第一列的位置。
* 屬性:
* version="1.0" XML文件的版本
* encoding="UTF-8" 代表XML打開文件時所采用編碼
* standalone="yes/no"(可寫也可以不寫) XML文件是否獨立的,如果不是獨立的,就可以引入外部文件。
* 產生亂碼(重點)
* 產生亂碼:在保存文件時,和打開文件時所采用的編碼不一致。
* 解決辦法:只需要保存文件時和打開文件所采用編碼一致就ok
* 注意:MyEclipse不會有亂碼的問題。
定義元素
* 必須有開始標簽結束標簽。每個節點開始結束必須都對應,缺一不可。xml是一個樹結構,只能包含一個根節點。
* 包含標簽主體內容 <abc>內容</abc>
* 不包含標簽主體 <abc/>
* 標簽必須要合理的嵌套
與HTML的注釋是相同 <!-- 也是XML的注釋 -->
注釋也不可以嵌套。
* XML的屬性命名規范與元素命名規范。
* 元素定義規范
* 區分大小寫 <P><p> 代表不同的標簽
* 不能以數字和中劃線開頭
* 不能以XML(Xml XML)開頭
* 不能包含空格和冒號
定義屬性
* 自定義的屬性 <abc xyz="" >
* 元素上不能有相同名稱的屬性 錯誤的:<abc xyz="" xyz="" >
* XML的屬性值必須使用引號引起來(單引號或者雙引號)
轉義字符
* < <
* > >
* & &
* " "
* ' '
CDATA區
* 作用:使用CDATA區中間的內容解析成文本內容(字符串)。
* 語法: <![CDATA[ 內容 ]]>
總結XML的語法
* XML必須有開始和結束標簽。
* XML區分大小寫
* XML必須正確的嵌套
* XML只能有一個根節點,必須要有的。
* XML的屬性的值需要使用引號(雙引號或者單引號)
* 轉義字符需要進行轉義,或者使用CDATA區括起來。
XML的約束
* 格式良好的XML:遵循XML的語法結構。
* 有效的XML:符合XML的約束的XML文檔。
兩種方式
DTD約束 schema約束
一.DTD約束
DTD約束開發的步驟
* 1:先編寫一個XML的文檔(被約束)。
* 2:編寫DTD的約束文檔(約束)。
* 3:創建一個DTD文檔。
* 3.1 定義元素 語法:<!ELEMENT 元素名稱 元素類型 > XML文檔中可以出現的元素
* 3.2 判斷哪些是復雜的元素,哪些是簡單元素
* 3.3 如果是簡單元素(只包含文本內容) 元素類型寫法:(#PCDATA)
* 3.4 如果是復雜元素(下邊包含子節點) 元素類型寫法:(子節點1,子節點2...)
DTD與XML結合一起
在XML的文件中引入DTD的約束文件。
* 直接寫在XML文件的上面
* <!DOCTYPE 根節點 [ DTD文件的內容 ] >
* 定義外部的DTD文件,引入外部的本地的DTD文件
* <!DOCTYPE 根節點 SYSTEM "DTD文件的地址">
* 引入外部的DTD文件,引入的網絡上的DTD文件
* <!DOCTYPE 根節點 PUBLIC "DTD文件的名稱" "DTD文件的地址">
DTD的語法
元素定義
* 寫法:<!ELEMENT 元素名稱 元素類型>
* 元素類型:
* (#PCDATA) 可解析的字符數據(字符串)
* EMPTY 空(沒有標簽主體)
* ANY 任意類型
* (子節點1,子節點2...) 當前的元素是復雜的元素,下面包含子節點
* 子節點之間關系
* 子節點與子節點出現順序的關系
* , :代表子節點按著順序出現
* | :子節點出現只能出現一個
* 子節點出現的數量的關系
* + :子節點可以出現1次或多次
* * :子節點可以出現0次或多次(任意次)
* ? :子節點可以出現0次或1次
屬性定義
* 寫法:
<!ATTLIST 元素名稱
屬性名稱 屬性類型 屬性約束
屬性名稱 屬性類型 屬性約束
>
* 屬性類型
* CDATA 字符數據(字符串)
* 枚舉:沒有關鍵字,寫法(值1|值2|值3),只能從枚舉中選擇其中一個值
* ID:代表是屬性是唯一的,值就不能相同了。值也不能是數字
* 屬性約束
* #REQUIRED 屬性是必須要出現的
* #IMPLIED 屬性的出現是可選的
* #FIXED 固定值 -- #FIXED "固定值"
* 默認值 提供默認值 ""
實體定義(了解)
* 寫法: <!ENTITY 別名 "值"> 定義了一個實體
* 作用:需要在XML的文件中需要引入實體,就會在XML文檔中顯示別名所對應的值
* 引入的語法:&別名;
二.schema約束
* schema約束為了DTD的局限性。
* schema約束和DTD的區別(面試題)
* XML schema約束符號XML的語法規則
* DOM或者SAX解析的方式很容易解析schema文檔
* schema約束對名稱空間支持的非常好的
* schema約束文檔比DTD支持更多的數據類型,支持自定義數據類型。
schema約束文檔快速入門
1:先創建schema的約束文檔
* 先引入W3C的名稱空間,在<schema>根節點上,使用xmlns="W3C的名稱空間"
* xmlns xml namespace
* xmlns="http://www.w3.org/2001/XMLSchema"
2 定義元素,想約束XML的元素
* <element name="元素名稱" >
3 判斷是否是復雜還是簡單
* 如果是簡單元素 使用type的屬性設置元素的數據類型
* 如果是復雜元素
* 聲明我是復雜元素 <complexType>
* 聲明子節點出現的關系 <sequence>
4 給自己定義的schema約束起名字(名稱空間的空間)
* targetNamespace="名字需要唯一的" 一般情況下使用域名。
5 elementFormDefault:決定xml文件里面的書寫格式
* unqualified :質量不好的
* qualified :質量好的(記住)
二:在XML的文檔中引入schema的約束文檔
* 目的:引入自己定義的schema約束文檔
* 需要先引入W3C的名稱空間:執行當前的XML文檔是一個實例文檔。
* xmlns="http://www.w3.org/2001/XMLSchema-instance" 一個實例文檔
* xmlns="http://www.w3.org/2001/XMLSchema" 一個約束文檔
* 引入自己定義的schema約束
* xmlns="http://www.itcast.cn/hm14"
* 遇到了問題:一個元素標簽上,有相同名稱的屬性了。
* 解決問題:起別名(前綴名)。
* 元素的標簽出現的概率小的名稱空間上起別名就ok了。
* 引入自己定義的schema文件的地址
* xsi:schemaLocation="schema約束文檔的名稱 文檔的地址"
名稱空間的概念
* 名稱空間:自己定義schema文檔,需要使用名稱空間起名字。
* 在XML文檔中引入了名稱空間,因為XML文檔可以引入多個名稱空間,只有一個默認的名稱空間。
* 理解相當java中包的結構。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 數據文件 引用多個Schema -->
<company xmlns = "http://www.example.org/company"
xmlns:dept="http://www.example.org/department"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd"
>
<employee age="30">
<!-- 部門名稱 -->
<dept:name>人力資源部</dept:name>
<!-- 員工名稱 -->
<name salary="3000.00">王曉曉</name>
</employee>
</company>
總結
- 上一篇: 密码机 密钥管理项目安装配置 从零开始
- 下一篇: C++primer 第 3 章 字符串、