# Bài 13: Sử dụng XML trong PostgreSQL

### Giới thiệu

XML (eXtensible Markup Language) là một ngôn ngữ đánh dấu được thiết kế để lưu trữ và vận chuyển dữ liệu. PostgreSQL hỗ trợ kiểu dữ liệu XML và cung cấp một số hàm và toán tử để xử lý dữ liệu XML. Việc lưu trữ và xử lý XML trong PostgreSQL có thể hữu ích trong một số trường hợp đặc biệt, mặc dù không phải là tính năng phổ biến nhất.

### 1\. Kiểu dữ liệu XML

PostgreSQL cung cấp kiểu dữ liệu XML theo chuẩn SQL/XML, giúp lưu trữ và xử lý dữ liệu XML một cách thuận tiện. Cú pháp cơ bản để khai báo một cột với kiểu dữ liệu XML như sau:

```sql
CREATE TABLE docs (
    id SERIAL PRIMARY KEY,
    content XML
);
```

### 2\. Chèn dữ liệu XML

Để chèn dữ liệu XML vào bảng, bạn sử dụng câu lệnh `INSERT INTO` với giá trị XML. Ví dụ:

```sql
INSERT INTO docs(content)
VALUES ('<?xml version="1.0"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>');
```

### 3\. Truy vấn dữ liệu XML

Bạn có thể sử dụng các hàm và toán tử của PostgreSQL để truy vấn và xử lý dữ liệu XML. Một số hàm cơ bản bao gồm `xpath()` và `xmlparse()`.

Ví dụ, để lấy giá trị của thẻ `<to>` trong tài liệu XML, bạn có thể sử dụng hàm `xpath()`:

```sql
SELECT xpath('/note/to/text()', content) FROM docs;
```

### 4\. Hàm PL/XSLT

PostgreSQL hỗ trợ mở rộng xử lý XML bằng ngôn ngữ XSLT thông qua tiện ích mở rộng PL/XSLT. Đây là ngôn ngữ chuyển đổi XML rất mạnh mẽ.

#### Cài đặt PL/XSLT

Đầu tiên, bạn cần cài đặt tiện ích mở rộng PL/XSLT:

```sql
CREATE EXTENSION plxslt;
```

#### Ví dụ sử dụng PL/XSLT

Dưới đây là một ví dụ về cách tạo hàm để loại bỏ các thẻ XML và chỉ giữ lại nội dung văn bản:

```sql
CREATE OR REPLACE FUNCTION striptags(xml) RETURNS text
LANGUAGE xslt
AS $$
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>
$$;
```

Bạn có thể sử dụng hàm này để truy vấn dữ liệu XML và loại bỏ các thẻ:

```sql
SELECT id, striptags(content) FROM docs;
```

### 5\. Hạn chế của XML trong PostgreSQL

Mặc dù PostgreSQL hỗ trợ XML, nhưng tính năng này chủ yếu được thêm vào để tuân thủ chuẩn SQL. Việc xử lý và lập chỉ mục XML trong PostgreSQL còn hạn chế so với các hệ quản trị cơ sở dữ liệu khác chuyên về XML.

### 6\. Kết luận

Kiểu dữ liệu XML trong PostgreSQL hữu ích cho việc lưu trữ và xử lý dữ liệu XML theo chuẩn SQL/XML. Tuy nhiên, nếu bạn cần xử lý XML phức tạp, bạn nên cân nhắc sử dụng các công cụ hoặc hệ quản trị cơ sở dữ liệu khác chuyên về XML.

### Tham khảo

* [PostgreSQL Documentation: XML Data Type](https://www.postgresql.org/docs/current/datatype-xml.html)
    
* [PostgreSQL Documentation: XML Functions](https://www.postgresql.org/docs/current/functions-xml.html)
    
* [Wikipedia: SQL/XML](https://en.wikipedia.org/wiki/SQL/XML)
    
* [GitHub: PL/XSLT](https://github.com/petere/plxslt)
