為文件建立文字巨集
許多開發人員在 xhtml 中使用實體代替特殊字元,但是也可以在 xml 中定義實體來簡化創作或者引用外部文件的內容。在我們建立文件型別定義(document type definition,dtd)並試圖減小它的表面複雜性以便適合人類閱讀時,實體也能派上用場。本文將全面介紹 xml 實體,並展示如何在文件中利用它們的優勢。
chris herborth, 技術作家兼軟體開發人員, freelance
關閉 [x]
2010 年 4 月 01 日
xml 是一種受到良好支援的 internet 標準,用於以一種特殊方式編碼結構化資料:xml 編碼的資料幾乎能夠用所有程式語言輕鬆解碼,甚至可以使用標準文字編輯器由人類閱讀或編寫。許多應用程式,特別是遵循現代標準的 web 瀏覽器,都可以直接處理 xml 資料。
xml 中的實體用於表示特殊字元(通常難以或不可能在標準鍵盤上輸入),重用 xml **段,將文件組織為幾個檔案,以及簡化 dtd 的編寫。
回頁首實體是對資料的引用;根據實體種類的不同,xml 解析器將使用實體的替代文字或者外部文件的內容來替代實體引用。本文中要介紹以下幾種實體,了解它們的工作方式,以及如何在我們自己的 xml 文件中利用它們的優勢。
所有實體(除引數實體外)都以乙個與字元(&)開始,以乙個分號(;)結束。xml 標準定義了所有 xml 解析器都必須實現的 5 種標準實體,儘管它們還支援其他實體。
我們經常會在 xhtml 和 xml 文件中看到和用到 &、< 和 > 實體,特別是那些通過展示示例來歸檔標記的文件。
回頁首對於字元實體,我們可以用十進位制格式(nnn;,其中 nnn 是字元的十進位制值)或十六進製制格式(hhh;,其中hhh 是字元的十六進製制值)來指定任意 unicode 字元。
在進行其他實體相關的解析之前,將首先替代字元實體。對 xml 解析器而言,字元實體與直接輸入指定字元的效果完全相同。字元實體類似於 c 程式語言中的三聯符(trigraphs):只是特定字元的替代表示。
還應該注意到,儘管 xml 解析器可以毫不費力地處理 「任何」 字元實體,但這些字元實體可能對處理應用程式和顯示系統毫無益處。確保能夠訪問適當的字型和編碼支援系統,以便在文件中顯示任何稀奇古怪的字元。當前字型中找不到某個適當的字元時,多數系統會顯示乙個某種佔位符。
回頁首命名實體(在 xml 規範中也稱為內部實體)就是我們在談論 「實體」 時所指的實體。命名實體在 dtd 或內部子集(即文件中 語句的一部分)中宣告,在文件中用作引用。在 xml 文件解析過程中,實體引用將由它的表示替代。
簡單來說,實體就是巨集,它們在我們處理文件時得到擴充套件。
xhtml 規範使用命名實體來表示 iso 8859-1 (latin 1) 字符集中包含的、但在多數鍵盤上沒有的特殊字元。其他實體用於指定特殊字元和符號。這些標準實體受到 web 瀏覽器的良好支援,甚至允許我們在只支援 7 位 ascii 字符集的系統(是的,還有人在使用古老的大型機系統)上使用純文字編輯器來編寫 xhtml 文件。清單 1 提供了 xhtml 1.0 的特殊字元的簡要列表。
清單 1. xhtml 1.0 的幾個特殊字元
如 清單 1(它是一塊 xhtml 1.0 special characters 宣告)所示,命名實體由字元實體替代。如 上一小節 所述,字元實體等同於在文件中直接輸入的引用字元。
我們在文件中使用 – 時,它由 unicode 字元 u+2013(短橫線 - 字元)替代。由於 – 的替代文字是乙個字元引用,因此它等同於輸入乙個短橫線字元。
命名實體在整個文件被讀取後進行解析。這樣,一些命名實體完全可以引用其他命名實體,其原因是所有實體都將在它們被擴充套件之前宣告。例如,清單 2 展示了兩個實體,其中乙個實體引用另乙個實體。
清單 2. 引用實體的實體
在乙個文件中使用 &c; 將擴充套件為 chris,&ch; 將擴充套件為完整的 chris herborth。
迴圈引用是實體中的錯誤。因建立了迴圈引用而使文件無效時,解析器會報告錯誤。
使用 firefox、safari 和 chrome 時,這些實體引用的效果與在儲存為 xml 檔案的 xhtml 文件中的效果一樣,但使用 microsoft® internet explorer® 8 時效果不一樣。我將在在文件中定義實體 小節中介紹如何宣告命名實體。
回頁首外部實體表示外部檔案的內容。外部實體在有些情況下很有用,比如說,您在建立一本圖書並且想將每一章儲存為乙個單獨的檔案。您可能會建立一組如 清單 3 所示的實體。
清單 3. 外部實體引用其他檔案
現在,當您在主圖書 xml 檔案(參見 清單 4)中將這些實體放到一起時,這些檔案的內容將插入在引用點。
清單 4. 將各章放到一起
<?xml version="1.0" encoding="utf-8"?>由於這些檔案的內容被插入到 xml 文件中,因此它們也必須是有效的 xml,而且它們必須是平衡的。也就是說,在乙個外部實體的引用檔案中開始的任何元素也必須在那個檔案中結束。當清單 4 中的 xml 文件被解析時,它將被讀取為乙個大文件,包含 chapter-1.xml、chapter-2.xml 和 chapter-3.xml 檔案的內容;xml 處理應用程式並不介意文件寫入到 4 個單獨的檔案中。&chap1;
&chap2;
&chap3;
回頁首引數實體只用於 dtd 和文件的內部子集中。它們使用百分號(%)而不是與字元,可以是命名實體或外部實體。
在 xhtml dtd 中,引數實體用於引用在外部檔案中宣告的 latin 1, special characters and symbols 實體集,以及用作快捷方式以重用 dtd 的某些部分,比如每個 xhtml 元素都支援的標準屬性集(參見清單 5)。
清單 5. xhtml 1 dtd 中的乙個引數實體
如 清單 5 所示,引數實體可以引用其他引數實體。與命名實體一樣,引數實體在整個文件被讀取之後才被擴充套件。
回頁首您也許已經注意到,實體使用 entity 宣告進行定義,既可以作為外部 dtd 的一部分(參見 清單 6),也可以作為文件的外部子集的一部分(參見 清單 7)。
清單 6. dtd 中的實體宣告
在宣告命名實體時,指定實體的名稱及其替代文字。替代文字可以包含字元實體、命名實體和元素等,但不包含引數實體。
清單 7. 內部子集中的實體宣告
<?xml version="1.0" encoding="utf-8"?>清單 7 中的 xhtml 文件(在我的系統上儲存為 entities.xml)在其內部子集中宣告了乙個名為 test-entity 的新實體。內部子集是 宣告的一部分,位於 dtd 的 public 和/或 system 識別符號之後的方括號中。is an entity.">
]>
&test-entity;
you can use it anywhere you'd use a standard xhtml entity:
&test-entity;
瀏覽器目前似乎不支援內部子集中的外部實體或引數實體,這也許是乙個安全措施。當這兩種型別的實體與 web 瀏覽器的呈現引擎一起使用時,可能被用於建立拒絕服務攻擊或其他惡意文件。
回頁首現在已經熟悉在文件中使用實體的機制;dtd 中的引數實體的工作方式與此相同。前面所示的清單展示了如何使用各種實體:
在需要反覆輸入相同的文字時,可以嘗試利用實體。以下是一些不錯的實體示例:公司的正式名稱、正在進行文件記錄的產品的名稱、版權、商標、註冊商標通知,以及電子郵件位址(參見清單 8)。
清單 8. 通過實體減少輸入
可能變化的事物(比如產品名稱)非常適合使用實體,這與在程式源**中宣告常量很相似。當產品名稱變化時,我們只需更新實體宣告,不必搜尋並替代所有檔案(參見 清單 9)。
清單 9. 使用實體輕鬆更新不斷變化的文件
回頁首基於 xml 的標準(比如 xhtml)定義了乙個有用的實體庫,這使得建立包含不能在標準鍵盤上直接輸入的字元的文件成為可能。命名實體的作用類似於巨集,允許您使用實體引用替代重複或難以輸入的文字。儘管 web 瀏覽器不支援外部實體,但是我們可以通過其他 xml 應用程式來使用它們建立復合文件,這使得標準化和重用文件的某些部分變得更容易。引數實體用於將外部宣告拖到 dtd 中,或者用於建立 dtd 內部巨集來改善可讀性。
在 xml 文件的 doctype 宣告中宣告命名實體很簡單,而且您可能已經知道如何在文件主體中使用它們。
xml中的實體引用(《和 )
在聊天專案中發現內容裡面只要有 和 這兩個字元,就顯示不了,後來查資料發現這是xml中的非法字元在作怪,解決的辦法是在編碼之前,也就是把文字資訊轉化成xml格式之前先用實體引用替換了,message message stringbyreplacingoccurrencesofstring withs...
在 XML 中新增實體
簡介 xml 是一種受到良好支援的 internet 標準,用於以一種特殊方式編碼結構化資料 xml 編碼的資料幾乎能夠用所有程式語言輕鬆解碼,甚至可以使用標準文字編輯器由人類閱讀或編寫。許多應用程式,特別是遵循現代標準的 web 瀏覽器,都可以直接處理 xml 資料。xml 中的實體用於表示特殊字...
XML 實體引用
xml 有 5 個預定的實體引用?xml 文件裡,除了表示乙個標記的開始之外,不允許有小於號 因為小於號 被 xml 解析器解總是被解釋為乙個標記的開始。if age 10 上面的寫法會導致 xml 文件的錯誤。為避免這樣的錯誤,而你又需要在 xml 文件內容裡使用小於號,你可以使用小於號的實體引用...