1. 程式人生 > 實用技巧 >認識XML(簡單瞭解)

認識XML(簡單瞭解)

XML筆記

2020、5、31

初識


  • XML 指可擴充套件標記語言(eXtensible Markup Language)。
  • XML 被設計用來傳輸和儲存資料。
  • 什麼是XML
    • XML 指可擴充套件標記語言(EXtensible Markup Language)。
    • XML 是一種很像HTML的標記語言。
    • XML 的設計宗旨是傳輸資料,而不是顯示資料。
    • XML 標籤沒有被預定義。您需要自行定義標籤。
    • XML 被設計為具有自我描述性。
    • XML 是 W3C 的推薦標準。
  • XML與HTML
    • XML 被設計用來傳輸和儲存資料,其焦點是資料的內容。
    • HTML 被設計用來顯示資料,其焦點是資料的外觀。
  • XML用途
    • XML 應用於 Web 開發的許多方面,常用於簡化資料的儲存和共享。
    • 把資料從HTML中分離
    • 簡化資料共享
    • 簡化資料傳輸
    • 簡化平臺變更
    • 建立新的網際網路語言
      • XHTML
      • 用於描述可用的 Web 服務 的 WSDL
      • 作為手持裝置的標記語言的 WAP 和 WML
      • 用於新聞 feed 的 RSS 語言
      • 描述資本和本體的 RDF 和 OWL
      • 用於描述針針對 Web 的多媒體 的 SMIL
  • 通常XML被用於資訊的記錄和傳遞,因此經常被用於充當配置檔案

XML樹結構


  • XML 文件形成了一種樹結構,它從"根部"開始,然後擴充套件到"枝葉"。
  • 示例
<?xml version="1.0" encoding="UTF-8"?>
頭部宣告xml的版本和編碼資訊

<note> 描述文件的根元素
    
    <to>Tove</to> 描述根的四個子元素
	<from>Jani</from>
	<heading>Reminder</heading>
	<body>Don't forget me this weekend!</body>

</note> 定義根元素結尾
  • 第一行是 XML 宣告。它定義 XML 的版本(1.0)和所使用的編碼(UTF-8 : 萬國碼, 可顯示各種語言)。
  • XML 文件必須包含根元素(也就是沒有兄弟元素的標籤)。該元素是所有其他元素的父元素
  • 示例2
<bookstore>
    <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>

XML語法規則


  • XML 必須包含根元素,它是所有其他元素的父元素
  • XML 宣告檔案的可選部分,如果存在需要放在文件的第一行,如下所示:
<?xml version="1.0" encoding="utf-8"?>
  • 所有XML元素必須包含結束標籤

    • 註釋:從上面的例項中,您也許已經注意到 XML 宣告沒有關閉標籤。這不是錯誤。宣告不是 XML 文件本身的一部分,它沒有關閉標籤。
  • XML嚴格區分大小寫

  • XML屬性值必須加引號

  • 註釋同HTML

  • 實體引用

    • 如果把字元 "<" 放在 XML 元素中,會發生錯誤,這是因為解析器會把它當作新元素的開始。為了避免這個錯誤,請用實體引用來代替 "<" 字元

      <message>if salary < 1000 then</message>
      
      <message>if salary &lt; 1000 then</message>
      
    • 在 XML 中,有 5 個預定義的實體引用:

      < < less than
      > > greater than
      & & ampersand
      ' ' apostrophe
      " " quotation mark
    • 註釋:在 XML 中,只有字元 "<" 和 "&" 確實是非法的。大於號是合法的,但是用實體引用來代替它是一個好習慣。

  • 註釋語法 <!-- This is a comment -->

  • XML會保留空格

XML元素


  • XML 元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分。
  • 一個元素可以包含:
    • 其他元素
    • 文字
    • 屬性
    • 或混合以上所有..
  • 元素命名規則
    • 名稱可以包含字母、數字以及其他的字元
    • 名稱不能以數字或者標點符號開始
    • 名稱不能以字母 xml(或者 XML、Xml 等等)開始
    • 名稱不能包含空格
  • XML 的優勢之一,就是可以在不中斷應用程式的情況下進行擴充套件。

XML屬性


  • 屬性(Attribute)提供有關元素的額外資訊。
  • 示例 <file type="gif">computer.gif</file>
    • 屬性通常提供不屬於資料組成部分的資訊。在下面的例項中,檔案型別與資料無關,但是對需要處理這個元素的軟體來說卻很重要
    • 屬性值必須被引號包圍,不過單引號和雙引號均可使用
    • 如果屬性值本身包含雙引號,可以使用單引號,或者可以使用字元實體
  • 沒有什麼規矩可以告訴我們什麼時候該使用屬性,而什麼時候該使用元素。我的經驗是在 HTML 中,屬性用起來很便利,但是在 XML 中,您應該儘量避免使用屬性。如果資訊感覺起來很像資料,那麼請使用元素吧。
    • 屬性不能包含多個值(元素可以)
    • 屬性不能包含樹結構(元素可以)
    • 屬性不容易擴充套件(為未來的變化)
  • 有時候會向元素分配 ID 引用。這些 ID 索引可用於標識 XML 元素,它起作用的方式與 HTML 中 id 屬性是一樣的
  • 元資料(有關資料的資料)應當儲存為屬性,而資料本身應當儲存為元素。

XML驗證


  • 通過 DTD 驗證的XML是"合法"的 XML。
  • 形式良好的XML
    • XML 文件必須有一個根元素
    • XML元素都必須有一個關閉標籤
    • XML 標籤對大小寫敏感
    • XML 元素必須被正確的巢狀
    • XML 屬性值必須加引號
  • XML錯誤會終止程式
    • XML 文件中的錯誤會終止您的 XML 應用程式。
    • W3C 的 XML 規範宣告:如果 XML 文件存在錯誤,那麼程式就不應當繼續處理這個文件。理由是,XML 軟體應當輕巧,快速,具有良好的相容性。
    • 如果使用 HTML,建立包含大量錯誤的文件是有可能的(比如您忘記了結束標籤)。其中一個主要的原因是 HTML 瀏覽器相當臃腫,相容性也很差,並且它們有自己的方式來確定當發現錯誤時文件應該顯示為什麼樣子。

XML檢視


  • 在所有主流的瀏覽器中,均能夠檢視原始的 XML 檔案。

  • XML 文件將顯示為程式碼顏色化的根以及子元素。通過點選元素左側的加號(+)或減號( - ),可以展開或收起元素的結構。要檢視原始的 XML 源(不包括 + 和 - 符號),選擇"檢視頁面原始碼"或從瀏覽器選單"檢視原始檔"。

  • 註釋:在 Safari 中,只有元素的文字將被顯示。要檢視原始的 XML,您必須右鍵單擊頁面,選擇"檢視原始檔"。

  • 如果一個錯誤的XML檔案被開啟,瀏覽器會報告錯誤。

XML CSS


  • 通過使用 CSS(Cascading Style Sheets 層疊樣式表),您可以新增顯示資訊到 XML 文件中。
  • 使用 <?xml-stylesheet type="text/css" href="cd_catalog.css"?> 連結外部XMLcss檔案
  • 使用 CSS 格式化 XML 不是常用的方法。
  • W3C 推薦使用 XSLT

XML XSLT


  • 通過使用 XSLT,您可以把 XML 文件轉換成 HTML 格式。
  • XSLT 是首選的 XML 樣式表語言。
  • XSLT(eXtensible Stylesheet Language Transformations)遠比 CSS 更加完善
  • XSLT 是在瀏覽器顯示 XML 檔案之前,先把它轉換為 HTML

XMLHttpRequest物件


  • XMLHttpRequest 物件用於在後臺與伺服器交換資料
    • 在不重新載入頁面的情況下更新網頁
    • 在頁面已載入後從伺服器請求資料
    • 在頁面已載入後從伺服器接收資料
    • 在後臺向伺服器傳送資料

XML解析器


  • 所有現代瀏覽器都有內建的 XML 解析器。
  • XML 解析器把 XML 文件轉換為 XML DOM 物件 - 可通過 JavaScript 操作的物件。
  • 出於安全方面的原因,現代的瀏覽器不允許跨域的訪問
    • 這意味著,網頁以及它試圖載入的 XML 檔案,都必須位於相同的伺服器上。

DTD


初識

  • Document Type Definition (文件型別定義)
  • 用於約束XML的文件格式,保證XML是一個有效的XML
  • 內部DTD(包含在XML文件中),外部DTD(外部單獨的一個檔案)

使用

  • 可以分為兩種(內部DTD,外部DTD)

  • 內部DTD

    • 假如 DTD 被包含在您的 XML 原始檔中,它應當通過下面的語法包裝在一個 DOCTYPE 宣告中

      <!DOCTYPE root-element(根元素) [element-declarations](元素宣告)>
      
    • 元素宣告

      <?xml version="1.0"?>
      <!DOCTYPE note [
      <!ELEMENT note (to,from,heading,body)>
      <!ELEMENT to (#PCDATA)>
      <!ELEMENT from (#PCDATA)>
      <!ELEMENT heading (#PCDATA)>
      <!ELEMENT body (#PCDATA)>
      ]>
      <note>
      <to>Tove</to>
      <from>Jani</from>
      <heading>Reminder</heading>
      <body>Don't forget me this weekend</body>
      </note>
      
      • !DOCTYPE note (第二行)定義此文件是 note 型別的文件。
      • !ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
      • !ELEMENT to (第四行)定義 to 元素為 "#PCDATA" 型別
      • !ELEMENT from (第五行)定義 from 元素為 "#PCDATA" 型別
      • !ELEMENT heading (第六行)定義 heading 元素為 "#PCDATA" 型別
      • !ELEMENT body (第七行)定義 body 元素為 "#PCDATA" 型別
    • 數量詞

      • +:表示元素出現一次或者多次,至少為一次
      • ?:表示元素出現一次或者零次
      • *:表示出現任意次
  • 外部DTD

    • 外部的DTD檔案是以dtd為字尾名的檔案,內部只需要寫上xml頭部宣告在後面直接寫宣告欄位即可

    • 假如 DTD 位於 XML 原始檔的外部,那麼它應通過下面的語法被封裝在一個 DOCTYPE 定義中

      <!DOCTYPE root-element SYSTEM "filename">
      
    • 示例

      <?xml version="1.0"?>
      <!DOCTYPE note SYSTEM "note.dtd">
      <note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
      </note>
      

構建模組

  • XML 和 HTML文件的主要的構建模組是元素標籤。
  • 所有的 XML 文件(以及 HTML 文件)均由以下簡單的構建模組構成:
    • 元素
      • 元素是 XML 以及 HTML 文件的主要構建模組
      • HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文字、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
    • 屬性
      • 屬性可提供有關元素的額外資訊
      • 屬性總是被置於某元素的開始標籤中。屬性總是以名稱/值的形式成對出現的。
    • 實體
      • 實體是用來定義普通文字的變數。實體引用是對實體的引用。
    • PCDATA
      • PCDATA 的意思是被解析的字元資料(parsed character data)。
      • 可把字元資料想象為 XML 元素的開始標籤與結束標籤之間的文字。
      • PCDATA 是會被解析器解析的文字。這些文字將被解析器檢查實體以及標記。
      • 文字中的標籤會被當作標記來處理,而實體會被展開。
      • 不過,被解析的字元資料不應當包含任何 &、< 或者 > 字元;需要使用 &、< 以及 > 實體來分別替換它們。
    • CDATA
      • CDATA 的意思是字元資料(character data)。
      • CDATA 是不會被解析器解析的文字。在這些文字中的標籤不會被當作標記來對待,其中的實體也不會被展開。

宣告元素

  • 在一個 DTD 中,元素通過元素宣告來進行宣告。

  • 示例

    <!ELEMENT element-name category>
    或
    <!ELEMENT element-name (element-content)>
    
  • 空元素通過類別關鍵詞EMPTY進行宣告:

    <!ELEMENT element-name EMPTY>
    
    例項:
    
    <!ELEMENT br EMPTY>
    
    XML example:
    
    <br />
    
  • 只有 PCDATA 的元素通過圓括號中的 #PCDATA 進行宣告:

    <!ELEMENT element-name (#PCDATA)>
    
    例項:
    
    <!ELEMENT from (#PCDATA)>
    
  • 通過類別關鍵詞 ANY 宣告的元素,可包含任何可解析資料的組合:

    <!ELEMENT element-name ANY>
    
    例項:
    
    <!ELEMENT note ANY>
    
  • 帶有一個或多個子元素的元素通過圓括號中的子元素名進行宣告:

    <!ELEMENT element-name (child1)>
    或
    <!ELEMENT element-name (child1,child2,...)>
    
    例項:
    
    <!ELEMENT note (to,from,heading,body)>
    
    • 當子元素按照由逗號分隔開的序列進行宣告時,這些子元素必須按照相同的順序出現在文件中
  • 宣告必須出現一次的元素

    <!ELEMENT element-name (child-name)>
    
    例項:
    
    <!ELEMENT note (message)>
    
  • 宣告"非.../即..."型別的內容

    例項:
    
    <!ELEMENT note (to,from,header,(message|body))>
    
    上面的例子聲明瞭:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素即 "body" 元素。
    
  • 宣告混合內容

    例項:
    
    <!ELEMENT note (#PCDATA|to|from|header|message)*>
    
    上面的例子聲明瞭:"note" 元素可包含出現零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
    

宣告屬性

  • 在 DTD 中,屬性通過 ATTLIST 宣告來進行宣告。

    <!ATTLIST element-name attribute-name attribute-type attribute-value>
    
    DTD 例項:
    
    <!ATTLIST payment type CDATA "check">
    
    XML 例項:
    
    <payment type="check" />
    
  • 屬性型別

    型別 描述
    CDATA 值為字元資料 (character data)
    (en1|en2|..) 此值是列舉列表中的一個值
    ID 值為唯一的 id
    IDREF 值為另外一個元素的 id
    IDREFS 值為其他 id 的列表
    NMTOKEN 值為合法的 XML 名稱
    NMTOKENS 值為合法的 XML 名稱的列表
    ENTITY 值是一個實體
    ENTITIES 值是一個實體列表
    NOTATION 此值是符號的名稱
    xml: 值是一個預定義的 XML 值
  • 預設屬性值

    解釋
    屬性的預設值
    #REQUIRED 屬性值是必需的
    #IMPLIED 屬性不是必需的
    #FIXED value 屬性值是固定的
  • 示例

    DTD:
    <!ELEMENT square EMPTY>
    <!ATTLIST square width CDATA "0">
    
    合法的 XML:
    <square width="100" />
    
  • < !ATTLIST element-name attribute-name attribute-type #REQUIRED>

    DTD:
    <!ATTLIST person number CDATA #REQUIRED>
    
    合法的 XML:
    <person number="5677" />
    
    非法的 XML:
    <person />
    
  • < !ATTLIST element-name attribute-name attribute-type #IMPLIED>

    DTD:
    <!ATTLIST contact fax CDATA #IMPLIED>
    
    合法的 XML:
    <contact fax="555-667788" />
    
    合法的 XML:
    <contact />
    
  • < !ATTLIST element-name attribute-name attribute-type #FIXED "value">

    DTD:
    <!ATTLIST sender company CDATA #FIXED "Microsoft">
    
    合法的 XML:
    <sender company="Microsoft" />
    
    非法的 XML:
    <sender company="W3Schools" />
    
  • < !ATTLIST element-name attribute-name (en1|en2|..) default-value>

    DTD:
    <!ATTLIST payment type (check|cash) "cash">
    
    XML 例子:
    <payment type="check" />
    或
    <payment type="cash" />
    

SVG


初識

  • SVG 意為可縮放向量圖形(Scalable Vector Graphics)。
  • SVG 使用 XML 格式定義影象。
  • 什麼是SVG
    • SVG 指可伸縮向量圖形 (Scalable Vector Graphics)
    • SVG 用來定義用於網路的基於向量的圖形
    • SVG 使用 XML 格式定義圖形
    • SVG 影象在放大或改變尺寸的情況下其圖形質量不會有所損失
    • SVG 是全球資訊網聯盟的標準
    • SVG 與諸如 DOM 和 XSL 之類的 W3C 標準是一個整體
  • SVG 於 2003 年 1 月 14 日成為 W3C 推薦標準。
  • SVG的歷史和優勢
    • 在 2003 年一月,SVG 1.1 被確立為 W3C 標準。參與定義 SVG 的組織有:Sun公司(已被Oracle公司收購)、Adobe、蘋果公司、IBM 以及柯達。
    • 優勢
      • SVG 可被非常多的工具讀取和修改(比如記事本)
      • SVG 與 JPEG 和 GIF 影象比起來,尺寸更小,且可壓縮性更強。
      • SVG 是可伸縮的
      • SVG 影象可在任何的解析度下被高質量地列印
      • SVG 可在影象質量不下降的情況下被放大
      • SVG 影象中的文字是可選的,同時也是可搜尋的(很適合製作地圖)
      • SVG 可以與 Java 技術一起執行
      • SVG 是開放的標準
      • SVG 檔案是純粹的 XML

使用

  • 示例程式碼

    <?xml version="1.0" standalone="no"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
      <circle cx="100" cy="50" r="40" stroke="black"
      stroke-width="2" fill="red" />
    </svg>
    
    • 解析
      • 第一行包含了 XML 宣告。請注意 standalone 屬性!該屬性規定此 SVG 檔案是否是"獨立的",或含有對外部檔案的引用。
      • standalone="no" 意味著 SVG 文件會引用一個外部檔案 - 在這裡,是 DTD 檔案。
      • 第二和第三行引用了這個外部的 SVG DTD。該 DTD 位於 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"。該 DTD 位於 W3C,含有所有允許的 SVG 元素
      • SVG 程式碼以 < svg >元素開始,包括開啟標籤和關閉標籤 < /svg> 。這是根元素。width 和 height 屬性可設定此 SVG 文件的寬度和高度。version 屬性可定義所使用的 SVG 版本,xmlns 屬性可定義 SVG 名稱空間。
      • SVG 的 < circle> 用來建立一個圓。cx 和 cy 屬性定義圓中心的 x 和 y 座標。如果忽略這兩個屬性,那麼圓點會被設定為 (0, 0)。r 屬性定義圓的半徑。
      • stroke 和 stroke-width 屬性控制如何顯示形狀的輪廓。我們把圓的輪廓設定為 2px 寬,黑邊框。
      • fill 屬性設定形狀內的顏色。我們把填充顏色設定為紅色。
      • 關閉標籤的作用是關閉 SVG 元素和文件本身。
      • 註釋:所有的開啟標籤必須有關閉標籤!
  • 在HTML中使用SVG

    • SVG 檔案可通過以下標籤嵌入 HTML 文件: 或者