Untuk jalur xml di mysql

Selama beberapa minggu terakhir, kami semakin akrab
Dukungan XML di MySQL. Pada artikel terakhir, kami
memperluas diskusi untuk memasukkan alat pihak ketiga yang disebut MySqlDump. Kami menggunakannya untuk menghasilkan dokumen XML yang kami tanyakan menggunakan prosedur tersimpan. Hari ini, kita akan selesai
dari seri dengan berbicara tentang cara memanipulasi data XML menggunakan XPath,
yang merupakan bahasa untuk menavigasi dan menanyakan dokumen XML

Fungsi UpdateXML()

Meskipun kami telah menghabiskan banyak waktu mempelajari ExtractValue()
fungsi, kami belum melihat dengan baik fungsi XML MySQL lainnya,
PerbaruiXML(). Itu karena kami fokus mengimpor data dari XML
dokumen ke dalam tabel MySQL.


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

1 adalah fungsi yang sedikit lebih canggih yang digunakan untuk mencocokkan dan
ganti sebagian fragmen XML dengan markup XML yang berbeda. Anda bisa melihat
bagaimana fungsi seperti itu akan berguna untuk memijat data tanpa mengonversi kembali
dan sebagainya antara XML dan struktur tabel

mengambil dua argumen string, sebuah fragmen markup XML dan XPath
ekspresi

ExtractValue(xml_frag, xpath_expr)
_

Ini mengembalikan node teks pertama yang merupakan anak dari elemen (s)
cocok dengan ekspresi XPath

Ini sebuah contoh

Katakanlah Anda ingin mengubah "


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

2" menjadi "

mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

3" dan simpan hasilnya ke dalam variabel. Inilah cara Anda melakukannya dengan menggunakan
yang

mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

_4


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

Jika tidak ditemukan node teks yang cocok untuk ekspresi, XML asli
string dikembalikan


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//dummy’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————+
| xml_node |
+—————————+
| <state><city/></state> |
+—————————+
1 row in set (0.03 sec)
_

Jika banyak kecocokan ditemukan, konten yang pertama
simpul teks anak dari setiap elemen yang cocok dikembalikan dalam urutan yang cocok


mysql> SELECT @new_xml_node:=UpdateXML(‘<state><city/></state><state><city/></state><state><city/></state>’,
-> ‘//city,
-> ‘<county><city/></county>’)
-> AS xml_node;

+——————————————————————–+
| xml_node |
+——————————————————————–+
| <state><city/></state><state><city/></state><state><city/></state> |
+——————————————————————–+
1 row in set (0.00 sec)

Karena fungsi UpdateXML() tidak membuat perbedaan antara kecocokan
pada elemen kosong dan tidak ada kecocokan sama sekali, perlu ada cara untuk membedakan antara dua situasi di mana tidak ada kecocokan
elemen ditemukan di xml_frag atau elemen semacam itu ditemukan tetapi
tidak berisi node teks anak. Cara melakukannya, adalah dengan menguji hasilnya
ExtractValue() menggunakan fungsi XPath count()


mysql> SELECT ExtractValue(‘<state><city/></state><state><city/></state><state><city/></state>’,
-> ‘count(//city)’) AS xml_node;
+———-+
| xml_node |
+———-+
| 3 |
+———-+
1 row in set (0.00 sec)

mysql> SELECT ExtractValue(‘<state><city/></state><state><city/></state><state><city/></state>’,
-> ‘count(//county)’) AS xml_node;
+———-+
| xml_node |
+———-+
| 0 |
+———-+
1 row in set (0.00 sec)

_

Penanganan kesalahan

Untuk


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

5 dan

mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

1,
pencari lokasi XPath yang digunakan harus valid dan XML yang akan dicari harus dibuat dengan baik
Jika locator tidak valid, kesalahan dihasilkan


mysql> SELECT @new_xml_node:=UpdateXML(‘<state><city/></state>’,
-> ‘//city/”state’, ‘<county><city/></county>’) AS xml_node;
ERROR 1105 (HY000): XPATH syntax error: ‘”state’

Jika XML yang akan dicari tidak terbentuk dengan baik, maka


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

7 dikembalikan, dan peringatan dikeluarkan


mysql> SELECT @new_xml_node:=UpdateXML(‘<state><city></state>’, ‘//city’,
-> ‘<county><city/></county>’) AS xml_node;
+———-+
| xml_node |
+———-+
| NULL |
+———-+
1 row in set, 1 warning (0.01 sec)

Anda dapat menampilkan peringatan dengan mengeluarkan perintah show warnings


mysql> show warnings;
+———+——+————————————————————————————-+
| Level | Code | Message |
+———+——+————————————————————————————-+
| Warning | 1525 | Incorrect XML value: ‘parse error at line 1 pos 21: ‘</state>’ unexpected (‘</city>’ wanted)’ |
+———+——+————————————————————————————-+
1 row in set (0.01 sec)

XML pengganti yang diteruskan sebagai argumen ketiga ke


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

1 tidak dicentang
bentuk yang baik sama sekali


mysql> SELECT @new_xml_node:=UpdateXML(‘<state><city/></state>’, ‘//city’,
-> ‘<<county><city/></county>>’) AS xml_node;
+——————————————-+
| xml_node |
+——————————————-+
| <state><<county><city/></county>></state> |
+——————————————-+
1 row in set (0.00 sec)

Menggunakan Variabel dalam Ekspresi XPath

Pada MySQL 5. 1. 20, Anda dapat menyediakan argumen pencari lokasi XPath di
variabel. Ini memberi Anda fleksibilitas untuk meneruskannya ke fungsi tersimpan dan
proc. Variabel dapat diperiksa dengan lemah atau kuat, tergantung pada sintaksnya
digunakan

Variabel yang Diperiksa dengan Lemah

Variabel yang menggunakan sintaks


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

_9 tidak
diperiksa untuk tipe atau apakah sebelumnya telah diberi nilai atau tidak
Karenanya, MySQL tidak akan melaporkan
peringatan atau kesalahan apa pun jika variabel memiliki tipe yang salah atau tidak terdefinisi
Misalnya, jika Anda salah mengeja variabel sebagai

mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//dummy’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————+
| xml_node |
+—————————+
| <state><city/></state> |
+—————————+
1 row in set (0.03 sec)
0 alih-alih

mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//dummy’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————+
| xml_node |
+—————————+
| <state><city/></state> |
+—————————+
1 row in set (0.03 sec)
0, dan variabel yang salah eja belum diberi nilai,
MySQL akan menetapkan nilai "tidak ada", atau NULL

Contoh berikut akan membantu memperjelas. Di dalamnya, kami membuat variabel
disebut @xml_cities. Ini berisi tiga negara bagian dengan sebuah kota di node teks. Selanjutnya kita
buat dua variabel untuk menyimpan beberapa informasi XPath. Kueri SELECT pertama
menunjukkan nilai @state_index_first
variabel bersama dengan
ExtractValue() fungsi. Sejak
Variabel @state_index_first berisi nilai 1, //state[@state_index_first]
ekspresi mengambil kota pertama yang ditemukan. “Chicago”

Itu
kueri SELECT kedua mengambil nilai dari
@state_index_second variabel, bersama dengan hasil ExtractValue(). Ini berfungsi seperti yang diharapkan
dan mengembalikan "Ocean City"

Itu
pernyataan SELECT akhir cacat karena tidak ada variabel @state_index_third. Meskipun klien MySQL
tidak mengeluh sama sekali dan fungsi ExtractValue() berjalan, tidak ada nilainya
dikembalikan. Ini bisa membuat kita percaya bahwa tidak ada lagi kota, ketika ada
jelas


mysql> SET @xml_cities = ‘<state value=”Illinois”>Chicago</state>
-> <state value=”New Jersey”>Ocean City</state>
-> <state value=”Maryland”>Baltimore</state>’;
Query OK, 0 rows affected (0.21 sec)

mysql> SET @state_index_first = 1, @state_index_second = 2;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @state_index_first, ExtractValue(@xml_cities,
-> ‘//state[[email protected]_index_first]’) AS ‘First City’;
+——————–+————+
| @state_index_first | First City |
+——————–+————+
| 1 | Chicago |
+——————–+————+
1 row in set (0.00 sec)

mysql> SELECT @state_index_second, ExtractValue(@xml_cities,
-> ‘//state[[email protected]_index_second]’) AS ‘Second City’;
+———————+————-+
| @state_index_second | Second City |
+———————+————-+
| 2 | Ocean City |
+———————+————-+
1 row in set (0.00 sec)

mysql> SELECT @state_index_third, ExtractValue(@xml_cities,
-> ‘//state[[email protected]_index_third]’) AS ‘Third City’;
+——————–+————+
| @state_index_third | Third City |
+——————–+————+
| NULL | |
+——————–+————+
1 row in set (0.00 sec)

Variabel Sangat Diperiksa

Untuk alasan yang diuraikan di atas, sebaiknya gunakan centang yang kuat
variabel. Ini seharusnya tidak mengejutkan, sebagai variabel yang kuat
pengecekan telah lama menjadi standar untuk bahasa pemrograman komputer. Untuk menggunakan


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//dummy’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————+
| xml_node |
+—————————+
| <state><city/></state> |
+—————————+
1 row in set (0.03 sec)
_2 sintaks,
Anda harus mendeklarasikan variabel di dalam prosedur tersimpan. Variabel seperti itu adalah
lokal ke prosedur tersimpan di mana ia didefinisikan, dan diperiksa
baik jenis maupun nilainya

Proc tersimpan berikut menerima string xml_data seperti
yang kita buat sebelumnya dan menambahkan hasil ExtractValue() ke a
meja sementara. Kami kemudian dapat PILIH semua kota sekaligus


mysql> SELECT @new_xml_node:=UpdateXML
(‘<state><city/></state>’,
-> ‘//city’,
-> ‘<county><city/></county>’)
-> AS xml_node;
+—————————————–+
| xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.03 sec)

mysql> SELECT @new_xml_node;
+—————————————–+
| @new_xml_node |
+—————————————–+
| <state><county><city/></county></state> |
+—————————————–+
1 row in set (0.00 sec)

0

Itu
merangkum tampilan kami pada dukungan XML di MySQL. Meskipun agak terbatas pada
titik ini, setiap versi baru menghadirkan lebih banyak fungsionalitas terkait XML. Di sana
juga banyak vendor pihak ketiga yang menyediakan alat untuk membantu mengisi kekosongan. Di dalam
di masa mendatang, kami berharap dapat melihat dukungan untuk pemformatan data yang lebih baru dan tidak bertele-tele
markup, seperti JSON

»


Lihat Semua Artikel oleh Kolumnis Rob Gravelle

Apa untuk jalur XML di SQL?

Kita dapat menggunakan FOR XML PATH untuk menyiapkan string yang dipisahkan koma dari data yang ada . Mari buat tabel Authors dan masukkan beberapa record ke dalamnya. Dalam data, kita dapat melihat bahwa kita memiliki kolom ID dan kolom AuthorName. Jika kita hanya memilih catatan, itu memberikan output dalam format berikut.

Bagaimana cara membaca file XML di MySQL?

Untuk mengimpor data dari file XML ke dalam tabel MySQL, pilih tabel di Object Browser dan pilih Table -> Import -> Import XML Data Using Load Local. atau (Ctrl+Shift+X) . Tabel. Daftar semua tabel database aktif saat ini ditampilkan. Pilih Tabel dari kotak daftar.

Bagaimana cara menyimpan data XML di MySQL?

Cara paling umum untuk menyimpan XML di MySQL adalah menggunakan fungsi LOAD_FILE() untuk membuka seluruh dokumen XML, menyimpannya dalam variabel, dan menyisipkan variabel ke dalam . .

Apakah MySQL mendukung XML?

Dukungan XML . ExtractValue dan UpdateXML Aurora MySQL supports two XML functions: ExtractValue and UpdateXML . ExtractValue menerima dokumen XML, atau fragmen, dan ekspresi XPATH. Fungsi mengembalikan data karakter anak atau elemen yang cocok dengan ekspresi XPATH.