ข้อมูล XML บน Postgres : มารู้จักรุ่นพี่ของวงการแลกเปลี่ยนข้อมูลระหว่าง service กัน
Tags: postgres, xml
Published: 2024-07-12 06:51:50

##บทนำ##
ครั้งก่อนเราเคยทำบทความ ["ข้อมูล JSON ใน PostgreSQL: โลกใหม่ของการจัดการข้อมูลบน Postgres"](https://dev.to/iconnext/khmuul-json-ain-postgresql-olkaihmkhngkaarcchadkaarkhmuulbn-postgres-3omk) ซึ่งเกี่ยวกับการจัดการข้อมูล JSON ไปแล้ววันนี้เราจะมาคุยเรื่องการจัดการข้อมูลแบบ xml กัน
ในยุคสมัยที่มีการแลกเลี่ยนข้อมูลระหว่าง service ผ่าน API โดยส่งข้อมูลในรูปแบบ JSON เคยทราบไหมว่าสมัยก่อน(สมัยนี้บางระบบก็ยังมีอยู่) เคยมีรูปแบบการแลกเปลี่ยนข้อมูลระหว่าง server โดยโปรโตคอลที่เรียกว่า SOAP(Simple Object Access Protocol) ซึ่งเป็นการแลกเปลี่ยนข้อมูลในรูปแบบ XML

##แล้ว XML คืออะไรล่ะ##
XML(Extensible Markup Language)ก็คือภาษาที่ใช้กำหนดโครงสร้างของข้อมูลแบบข้อความคล้ายกับภาษา HTML ซึ่งก็คือภาษากำหนดโครงสรา้งที่แสดงหน้าเว็บยังไงล่ะโดยรูปแบบของ XML จะประกอบด้วย
- **โครงสร้างแบบต้นไม้:** ข้อมูล XML จะถูกจัดเรียงเป็นโครงสร้างแบบต้นไม้ ประกอบด้วย element attribute และ content
- **Element:** หน่วยพื้นฐานของ XML เปรียบเสมือนแท็กใน HTML แต่ละ element จะมีชื่อและอาจมี attribute เพิ่มเติม
- **Attribute:** ข้อมูลเพิ่มเติมเกี่ยวกับ element เก็บไว้ในรูปคู่ key-value
- **Content:** เนื้อหาที่อยู่ภายใน element อาจเป็นข้อความ element ย่อย หรือ entity references
- **Document:** โครงสร้าง XML ทั้งหมด ประกอบด้วย element attribute และ content
ตามตัวอย่าง
```xml
<?xml version="1.0" encoding="UTF-8"?>
<product>
  <name>สินค้า A</name>
  <price>100</price>
  <stock>50</stock>
  <categories>
    <category>หมวดหมู่ 1</category>
    <category>หมวดหมู่ 2</category>
  </categories>
</product>
```

***แล้ว Postgres จัดการข้อมูลชนิด XML อย่างไร***
ตัว postgres ไม่มีประเภทข้อมูล  xml โดย postgres จะดำเนินการผ่าน extension ที่ชื่อ xml2 ซึ่งช่วยให้สามารถจัดเก็บ ประมวลผล และดึงข้อมูล XML ในฐานข้อมูล PostgreSQL ได้อย่างมีประสิทธิภาพ โดยรองรับการจัดการประเภทข้อมูลคือ
- xml: เก็บข้อมูล XML แบบดั้งเดิม(text)
- xmlb: เก็บข้อมูล XML แบบ binary
(เอะคุ้นๆ นะ ดังนั้นข้อดีของ xmlb น่าจะคล้ายกับประเภทข้อมูล json)

**การสร้างคอลัมน์ประเภท XML**
```sql
CREATE TABLE products (
  id serial PRIMARY KEY,
  name varchar(255) NOT NULL,
  details xml NOT NULL
);
```
จะเป็นการสร้างตารางที่มีคอลัมน์ details มีข้อมูลชนิด xml ขึ้นมา

**การเพิ่มข้อมูล XML**
```SQL
INSERT INTO products (name, details)
VALUES ('สินค้า A', '<product><name>สินค้า A</name><price>100</price><stock>50</stock></product>');
Use code with caution.
content_copy
```

**การดึงข้อมูล XML**
```SQL
SELECT id, name, details->'name' AS product_name FROM products;
Use code with caution.
content_copy
```

**การแก้ไขข้อมูล XML**

```SQL
UPDATE products
SET details = details || xml '<discount>10</discount>'
WHERE id = 1;
Use code with caution.
```


**ฟังก์ชันสำหรับการประมวลผลข้อมูล XML**

PostgreSQL รองรับฟังก์ชัน XML มากมาย
สำหรับการประมวลผลข้อมูล XML ตัวอย่างฟังก์ชันที่ใช้ทั่วไป ได้แก่:

- xml_parse: แปลงสตริง XML เป็นค่าประเภท XML
- xml_serialize: แปลงค่าประเภท XML เป็นสตริง XML
- xpath: ดึงข้อมูล XML โดยใช้ XPath


**ส่งท้าย**
ถามว่าเรายังจำเป็นต้องเก็บข้อมูล XML อยู่ไหมผมเคยพัฒนาระบบที่ต้องส่งข้อมูลไปยัง service ที่ใช้ SOAP โปรโตคอลในการเชื่อมต่อซึ่งต้องส่งและเก็บข้อมูลการทำ transaction ย้อนหลังได้ตอนนั้นใช้ Microsoft SQL Server ที่มีประเภทข้อมูลเป็น xml ติดมาด้วย อีกทั้งยังมีอีกหลาย service ที่ยังมีการใช้ SOAP หวังว่าบทความนี้จะเป็นประโยชน์บ้างนะครับ
xml_update: อัปเดตข้อมูล XML