xml
資料類型可用於儲存 XML 資料。相較於將 XML 資料儲存在 text
欄位中,它的優點在於它會檢查輸入值的格式是否正確,並且有支援函式可以對其執行類型安全的運算;請參閱第 9.15 節。使用此資料類型需要在建置時使用 configure --with-libxml
。
xml
類型可以儲存格式正確的 「文件」(如 XML 標準所定義),以及 「內容」片段,這些片段是參考 XQuery 和 XPath 資料模型中更寬鬆的 「文件節點」所定義。粗略地說,這表示內容片段可以有多個頂層元素或字元節點。運算式
可用於評估特定 xmlvalue
IS DOCUMENTxml
值是完整文件還是僅為內容片段。
關於 xml
資料類型的限制和相容性注意事項,請參閱第 D.3 節。
若要從字元資料產生 xml
類型的值,請使用 xmlparse
函式:
XMLPARSE ( { DOCUMENT | CONTENT } value
)
範例
XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>') XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')
雖然這是根據 SQL 標準將字串轉換為 XML 值的唯一方法,但也可以使用 PostgreSQL 特有的語法
xml '<foo>bar</foo>' '<foo>bar</foo>'::xml
。
xml
類型不會根據文件類型宣告 (DTD) 驗證輸入值,即使輸入值指定了 DTD 也是如此。目前也沒有內建支援來驗證其他 XML 綱要語言,例如 XML Schema。
反向運算,從 xml
產生字串值,使用 xmlserialize
函式:
XMLSERIALIZE ( { DOCUMENT | CONTENT }value
AStype
[ [ NO ] INDENT ] )
type
可以是 character
、character varying
或 text
(或是其中一個的別名)。同樣地,根據 SQL 標準,這是類型 xml
和字元類型之間轉換的唯一方法,但 PostgreSQL 也允許您直接轉換值。
INDENT
選項會導致結果經過美化列印,而 NO INDENT
(預設值)只會發出原始輸入字串。轉換為字元類型也會產生原始字串。
當字串值在類型 xml
之間轉換,而沒有經過 XMLPARSE
或 XMLSERIALIZE
時,DOCUMENT
與 CONTENT
的選擇取決於 「XML 選項」 會話配置參數,可以使用標準指令設定
SET XML OPTION { DOCUMENT | CONTENT };
或更像 PostgreSQL 的語法
SET xmloption TO { DOCUMENT | CONTENT };
預設值為 CONTENT
,因此允許所有形式的 XML 資料。
在客戶端、伺服器以及它們之間傳遞的 XML 資料中處理多種字元編碼時,必須格外小心。 當使用文字模式將查詢傳遞給伺服器,並將查詢結果傳遞給客戶端(這是正常模式)時,PostgreSQL 會將客戶端和伺服器之間傳遞的所有字元資料,轉換為各自終端的字元編碼;請參閱第 23.3 節。 這包括 XML 值的字串表示形式,例如上面的範例。 這通常意味著,由於字元資料在客戶端和伺服器之間傳輸時會被轉換為其他編碼,因此 XML 資料中包含的編碼宣告可能會失效,因為嵌入的編碼宣告沒有更改。 為了應對這種情況,輸入到 xml
類型中的字元串所包含的編碼宣告會被忽略,並且內容會被假定為使用當前伺服器編碼。 因此,為了正確處理,XML 資料的字元串必須以當前客戶端編碼從客戶端發送。 客戶端有責任在將文件發送到伺服器之前將其轉換為當前客戶端編碼,或者適當調整客戶端編碼。 在輸出時,xml
類型的值將沒有編碼宣告,客戶端應假定所有資料都使用當前客戶端編碼。
當使用二進制模式將查詢參數傳遞給伺服器,並將查詢結果傳遞回客戶端時,不會執行編碼轉換,因此情況有所不同。 在這種情況下,將會遵守 XML 資料中的編碼宣告,如果沒有編碼宣告,則會假定資料使用 UTF-8 編碼(XML 標準的要求;請注意,PostgreSQL 不支援 UTF-16)。 在輸出時,資料將具有指定客戶端編碼的編碼宣告,除非客戶端編碼為 UTF-8,在這種情況下,它將被省略。
毋庸置疑,如果 XML 資料編碼、客戶端編碼和伺服器編碼相同,則使用 PostgreSQL 處理 XML 資料將更不容易出錯且更有效率。 由於 XML 資料在內部以 UTF-8 處理,如果伺服器編碼也是 UTF-8,則計算效率最高。
當伺服器編碼不是 UTF-8 時,某些與 XML 相關的函數可能根本無法在非 ASCII 資料上工作。 已知這對於 xmltable()
和 xpath()
尤其是一個問題。
xml
資料類型很不尋常,因為它沒有提供任何比較運算子。 這是因為對於 XML 資料來說,沒有定義良好且普遍有用的比較演算法。 這的一個後果是,您無法通過將 xml
欄位與搜尋值進行比較來檢索行。 因此,XML 值通常應伴隨一個單獨的鍵欄位,例如 ID。 比較 XML 值的另一種解決方案是先將它們轉換為字元串,但請注意,字元串比較與有用的 XML 比較方法幾乎沒有關係。
由於 xml
資料類型沒有比較運算子,因此無法直接在此類型的欄位上建立索引。 如果需要快速搜尋 XML 資料,可能的解決方法包括將運算式轉換為字元串類型並對其建立索引,或者對 XPath 運算式建立索引。 當然,必須調整實際的查詢以通過索引的運算式進行搜尋。
PostgreSQL 中的全文檢索功能也可以用於加速 XML 資料的全文檔搜尋。 然而,必要的預處理支援尚未在 PostgreSQL 發行版本中提供。
如果您在文件中發現任何不正確、與您特定功能的經驗不符或需要進一步澄清的地方,請使用此表格回報文件問題。