淺析XML

airl發表於2022-03-15

概述XML文件結構

  • 每個XML文件都分為兩部分:序言(Prolog)和文件元素(或文件節點)
    image

例子:寫一段XML然後簡單分析一下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myfile [
        <!ELEMENT myfile (title,author)>
        <!ELEMENT title (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        ]>
<myfile id="11">
    <!--註釋資訊-->
    <title>XML</title>
    <author>hjk</author>
</myfile>

分析

  • 首先前六行是XML文件的序言,包含了此文件的後設資料,就是文件的基本資料

    • 第一行<?xml version="1.0" encoding="UTF-8"?>是XML文件的一個宣告,有效的XML文件的第一行必須是XML文件的宣告;這個格式是基本固定的前面的標籤必須寫成<?xml,後面version=是版本號,目前只有兩個版本1.0和1.1,encoding是編碼格式,不管是version還是encoding等於的內容都必須用單引號或者雙引號包含。
    • 第二行內部定義了XML文件的DTD,DTD就是自定義標籤之間的關係。<!ELEMENT myfile (title,author)>這個意思是myfile標籤包含兩個子標籤title,author。<!ELEMENT title (#PCDATA)>表示title是一個PCDATA型別,PCDATA(可解析的字元資料)。
  • 第七行到最後就是文件節點

    • <myfile>是根元素,ids是屬性,下面是註釋,title和author是子元素
  • 上面沒有定義處理命令,補充一下:處理指令可以用於將資訊傳遞給應用程式。處理指令可以出現在文件任意位置的標記外部。可以出現在序言中,包括文件的型別定義(DTD),文字內容或者文件之後
    處理指令的語法:

<?target instructions?>
  • 意思
    • target 標識指令指向哪個應用程式。
    • instruction 字元,描述了應用程式要處理的資訊

一個常用的處理指令的例子是通知瀏覽器對XML進行轉換,如下所示:

<?xml-stylesheet type="text/xsl" href="appUsers.xslt" ? >

XML語法

XML文件規則

格式良好的XML文件,包含一個或多個元素,並且他們相互之間必須正確的巢狀。必須有且只有一個根元素,包含其他所有的元素。所有元素構成一個簡單的層次樹,所以元素與元素之間唯一的直接關係就是父子關係。

格式良好的XML文件

格式良好的XML文件不一定是有效的XML文件,有效的XML文件肯定是格式良好的XML文件

  • 必須包含宣告語句
<?xml version="1.0" encoding="UTF-8"?>
  • 區分大小寫
    標籤是兩個標籤,不能進行匹配,,否者報錯.建議同意使用大小寫
  • 所有XML文件必須有且只有一個根元素
  • 屬性值必須使用引號
  • 所有標籤必須有相應的結束標籤
  • 所有空標籤必須被關閉
<title></title>
</title>
  • 標籤必須正確巢狀
<title><name>...</name></title>  正確
<title><name>...</title></name>  錯誤

XML字元引用和實體引用

字元引用

有一些字元鍵盤上是沒有的或者是一些圖形字元。所以XML文件可以使用Unicode或者十六進位制數字將他們字元引用的形式加入
語句為:

&#169;
&#xA9;

程式碼:

<?xml version="1.0" encoding="UTF-8"?>

<data>
    <char>&#169;</char>
    <char>&#xA9;</char>
</data>

效果:
image

實體引用

實體引用時在一個合法的XML名字前面加上一個&,後面加上一個分號

&name;
實體(這裡面最後面應該時英文分號; 用途
&amp; 通常用來代替&
&lt; 通常代替<
&gt; 通常代替>
&apos; 通常代替'
&quot; 通常代替"

自定義實體引用
必須在文件使用前,在DTD文件中進行定義。
自定義實體定義語法:

<!DOCTYPE filename[
<!ENTITF entity-name"entity-content"
]>

例子

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE
        student[
        <!ELEMENT student (name,sex)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ENTITY me "hjk">
        ]>
<student>
    <name>&me;</name>
    <sex>男</sex>
</student>

效果:可以看到&me;被賦值為hjk,這是因為上面的DTD定義的原因。
image

名稱空間

XML名稱空間提供了一種避免命名衝突的方法。
命名衝突,就是兩個不同的XML文件使用同一個名字,來描述不同元素的情況。如果這兩個XML文件時獨立的執行的,那沒有影響,但是如果恰巧一起使用,就會出現命名衝突的情況。

名稱空間使用

名稱空間通過給標識名稱加一個網址(URL)以定位的方法來區別這些名稱相同的標識。名稱空間需要在XML文件開頭部分宣告,名稱空間宣告一般放置在元素的開始標記處。
語法格式

xmlns:prefix="URL"

prefix是名稱空間的字首,是可選的。


名稱空間兩種宣告方式
  • 預設宣告
<?xml version="1.0" encoding="UTF-8" ?>

<student xmlns="http://www.edu.cn/xxx/xx">
    <name>hjk</name>
    <sex>男</sex>
</student>

我個人理解就是給student加一個唯一的標識,其實這個URL存在正確與否都不重要,只要是唯一的就行,用這個URL來區分這些標籤。

  • 明確宣告
<?xml version="1.0" encoding="UTF-8" ?>

<h:student xmlns:h="http://www.edu.cn/xxx/xx">
    <h:name>hjk</h:name>
    <h:sex>男</h:sex>
</h:student>

明確宣告感覺就像是取一個別名,這個元素的每一個子元素和他本身都需要用這個別名的字首。

DTD兩種宣告方式

內部DTD

上面已經提到了,這裡簡單說一下

<!DOCTYPE myfile [
        <!ELEMENT myfile (title,author)>
        <!ELEMENT title (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        ]>

外部DTD

外部DTD的好處就是:它可以方便搞笑的被多個XML文件共享
外部D他的定義和內部差不多,不在需要<!DOCTYPE>,直接寫內容就可以,但是要儲存成dtd檔案,即檔名為name.dtd,name是檔名
外部dtd檔案,檔名myfile.dtd

<!ELEMENT myfile(title,author)>
<!ELEMENT title(#PCDATA)>
<!ELEMENT author(#PCDATA)>

那麼如何引用呢。引用格式為

<!DOCTYPE type-of-doc SYSTEM/PUBLIC"dtdfile-name">

例項引用上面mufile.dtd檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE myfile SYSTEM "myfile.dtd">
<myfile>
    <title>XML</title>
    <author>hjk</author>
</myfile>

解釋說明:

  • !DOCTYPE 指要定義一個DOCTYOE
  • type-of-doc 指文件型別名稱,由使用者自己定義,通常與使用這個DTD檔案XML文件根元素名稱一致
  • SYSTEM/PUBLIC 二選一,SYSTEM是指私有的外部DTD檔案,就是自己或者合夥人寫的。PUBLIC指文件呼叫一個公用的DTD檔案,由一個權威的機構定製的,提供給特定行業或公眾的DTD。
  • dtdfile-name;就是存放DTD檔案的地址和名稱,同目錄下只寫名稱就可以。

以上是目前所學習的理解!!