Tạo nội dung XML

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 236 - 240)

Chương 9. Hàm và toán tử

9.14.1. Tạo nội dung XML

Một tập hợp các hàm và các biểu thức giống hàm là sẵn sàng cho việc tạo ra nội dung XML từ các dữ liệu SQL. Như vậy, chúng đặc biệt phù hợp cho việc định dạng các kết quả truy vấn trong các tài liệu XML cho việc xử lý trong các ứng dụng máy trạm.

9.14.1.1. xmlcomment

xmlcomment(text)

Hàm xmlcomment tạo ra một giá trị XML có chứa một bình luận XML với văn bản được chỉ định như là nội dung. Văn bản đó không thể có “--” hoặc kết thúc với một “-” sao cho cấu trúc kết quả là một bình luận XML hợp lệ. Nếu đối số là null, thì kết quả là null.

Ví dụ:

SELECT xmlcomment(’hello’);

xmlcomment ---

<!--hello-->

9.14.1.2. xmlconcat

xmlconcat(xml[, ...])

Hàm xmlconcat ghép nối một danh sách các giá trị XML riêng rẽ để tạo một giá trị duy nhất có chứa một phân mảnh nội dung XML. Các giá trị null được làm mờ; kết quả chỉ là null nếu không có các đối số nonnull.

Ví dụ:

SELECT xmlconcat(’<abc/>’, ’<bar>foo</bar>’);

xmlconcat ---

<abc/><bar>foo</bar>

Các khai báo XML, nếu có, được kết hợp như sau. Nếu tất cả các giá trị đối số có cùng khai báo phiên bản XML, thì phiên bản đó được sử dụng trong kết quả đó, nếu không thì không phiên bản nào được sử dụng. Nếu tất cả các giá trị đối số có giá trị khai báo đứng một mình là “yes” (có), thì giá trị đó được sử dụng trong kết quả. Nếu tất cả các giá trị đối số có một giá trị khai báo đứng một mình và ít nhất một giá trị là “no” (không), thì nó được sử dụng trong kết quả đó. Kết quả khác sẽ không có khai báo đứng một mình. Nếu kết quả được xác định phải yêu cầu một khai báo đứng một mình nhưng không khai báo phiên bản nào có, thì một khai báo phiên bản với phiên bản 1.0 sẽ được sử dụng vì XML đòi hỏi một khai báo XML có chứa một khai báo phiên bản. Việc mã hóa các khai báo bị bỏ qua và bị loại bỏ trong tất cả các trường hợp.

Ví dụ:

SELECT xmlconcat(’<?xml version="1.1"?><foo/>’, ’<?xml version="1.1" standalone="no"?><bar/>’);

xmlconcat

---

<?xml version="1.1"?><foo/><bar/>

9.14.1.3. xmlelement

xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])

Biểu thức xmlelement tạo ra một phần tử XML, được trao tên, các thuộc tính và nội dung. Ví dụ:

SELECT xmlelement(name foo);

xmlelement ---

<foo/>

SELECT xmlelement(name foo, xmlattributes(’xyz’ as bar));

xmlelement ---

<foo bar="xyz"/>

SELECT xmlelement(name foo, xmlattributes(current_date as bar), ’cont’, ’ent’);

xmlelement

---

<foo bar="2007-01-26">content</foo>

Các tên phần tử và thuộc tính mà không phải là các tên XML hợp lệ được thoát bằng việc thay thế các ký tự có lỗi bằng sự tuần tự _xHHHH_, trong đó HHHH là điểm mã Unicode của ký tự theo ký hiệu hexadecimal (hệ 16). Ví dụ:

SELECT xmlelement(name "foo$bar", xmlattributes(’xyz’ as "a&b"));

xmlelement

---

<foo_x0024_bar a_x0026_b="xyz"/>

Một tên thuộc tính rõ ràng cần không được chỉ định nếu giá trị thuộc tính đó là một tham chiếu cột, trong trường hợp đó tên cột sẽ được sử dụng như là tên thuộc tính một cách mặc định. Trong các trường hợp khác, thuộc tính đó phải được đưa ra một cái tên rõ ràng. Vì thế ví dụ này là hợp lệ:

CREATE TABLE test (a xml, b xml);

SELECT xmlelement(name test, xmlattributes(a, b)) FROM test;

Nhưng các ví dụ này thì không:

SELECT xmlelement(name test, xmlattributes(’constant’), a, b) FROM test;

SELECT xmlelement(name test, xmlattributes(func(a, b))) FROM test;

Nội dung của phần tử, nếu được chỉ định, sẽ được định dạng theo dạng dữ liệu của nó. Nếu nội dung là bản thân dạng xml, thì các tài liệu XML phức tạp có thể được cấu thành. Ví dụ:

SELECT xmlelement(name foo, xmlattributes(’xyz’ as bar), xmlelement(name abc),

xmlcomment(’test’), xmlelement(name xyz));

xmlelement

---

<foo bar="xyz"><abc/><!--test--><xyz/></foo>

Nội dung của các dạng khác sẽ được định dạng trong các dữ liệu ký tự XML hợp lệ. Điều này có nghĩa đặc biệt rằng các ký tự <, > và & sẽ được biến đổi thành các thực thể. Các dữ liệu nhị phân (dạng dữ liệu bytea) sẽ được thể hiện ở mã base64 hoặc hex, phụ thuộc vào thiết lập của tham số cấu hình xmlbinary. Hành vi đặc biệt đối với các dạng dữ liệu cá nhân được kỳ vọng sẽ tiến hóa để phù hợp với các dạng dữ liệu của SQL và PostgreSQL với đặc tả Sơ đồ XML, ở điểm mà một mô tả chính xác hơn sẽ xuất hiện.

9.14.1.4. xmlforest

xmlforest(content [AS name] [, ...])

Biểu thức xmlforest tạo ra một rừng (tuần tự) XML các phần tử bằng việc sử dụng các tên và nội dung được đưa ra.

Các ví dụ:

SELECT xmlforest(’abc’ AS foo, 123 AS bar);

xmlforest

---

<foo>abc</foo><bar>123</bar>

SELECT xmlforest(table_name, column_name) FROM information_schema.columns

WHERE table_schema = ’pg_catalog’;

xmlforest

---

<table_name>pg_authid</table_name><column_name>rolname</column_name>

<table_name>pg_authid</table_name><column_name>rolsuper</column_name>

...

Như được thấy trong ví dụ thứ 2, tên phần tử có thể làm mờ nếu giá trị nội dung là một tham chiếu cột, trong trường hợp đó thì tên cột được sử dụng mặc định. Nếu không, một tên phải được chỉ định.

Các tên phần tử mà không là các tên XML hợp lệ sẽ được thoát như được chỉ ra cho xmlelement ở trên. Tương tự, dữ liệu nội dung được thoát để làm cho nội dung XML hợp lệ, trừ phi nó là dạng xml rồi.

Lưu ý rằng các rừng XML không là các tài liệu XML hợp lệ nếu chúng bao gồm nhiều hơn một phần tử, nên có thể là hữu dụng để bọc các biểu thức xmlforest trong xmlelement.

9.14.1.5. xmlpi

xmlpi(name target [, content])

Biểu thức xmlpi tạo ra một lệnh xử lý XML. Nội dung, nếu có, phải không chứa sự tuần tự ký tự ?>.

Ví dụ:

SELECT xmlpi(name php, ’echo "hello world";’);

xmlpi

---

<?php echo "hello world";?>

9.14.1.6. xmlroot

xmlroot(xml, version text | no value [, standalone yes|no|no value])

Biểu thức xmlroot chỉnh các thuộc tính nút gốc root của một giá trị XML. Nếu một phiên bản được chỉ định, nó thay thế giá trị trong khai báo phiên bản nút gốc đó; nếu một thiết lập đứng một mình được chỉ định, thì nó thay thế giá trị trong khai báo đứng một mình của nút gốc đó.

SELECT xmlroot(xmlparse(document ’<?xml version="1.1"?><content>abc</content>’), version ’1.0’, standalone yes);

xmlroot

---

<?xml version="1.0" standalone="yes"?>

<content>abc</content>

9.14.1.7. xmlagg

xmlagg(xml)

Hàm xmlagg là, không giống như các hàm khác được mô tả ở đây, một hàm tổng hợp. Nó ghép nối các giá trị đầu vào tới lời gọi của hàm tổng hợp, rất giống xmlconcat làm, ngoại trừ là sự ghép nối xảy ra khắp các hàng thay vì khắp các biểu thức trong một hàng duy nhất. Xem Phần 9.18 để có thêm thông tin về các hàm tổng hợp.

Ví dụ:

CREATE TABLE test (y int, x xml);

INSERT INTO test VALUES (1, ’<foo>abc</foo>’);

INSERT INTO test VALUES (2, ’<bar/>’);

SELECT xmlagg(x) FROM test;

xmlagg

---

<foo>abc</foo><bar/>

Để xác định trật tự ghép nối, một mệnh đề ORDER BY có thể được thêm vào lời gọi tổng hợp như được mô tả trong Phần 4.2.7. Ví dụ:

SELECT xmlagg(x ORDER BY y DESC) FROM test;

xmlagg

---

<bar/><foo>abc</foo>

Tiếp cận phi tiêu chuẩn sau đây được sử dụng để khuyến cáo trong các phiên bản trước, và có thể vẫn còn hữu dụng trong các trường hợp đặc biệt:

SELECT xmlagg(x) FROM (SELECT * FROM test ORDER BY y DESC) AS tab;

xmlagg

---

<bar/><foo>abc</foo>

9.14.1.8. Từ vị XML

xml IS DOCUMENT

Biểu thức IS DOCUMENT trả về đúng (true) nếu giá trị đối số XML là một tài liệu XML phù hợp, sai (false) nếu nó không (đó là, đây là một sự phân mảnh nội dung), hoặc null nếu đối số là null. Xem Phần 8.13 về sự khác biệt giữa các tài liệu và các phân mảnh nội dung.

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 236 - 240)

Tải bản đầy đủ (PDF)

(372 trang)