PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menggunakan xpath untuk mengekstrak data dari kolom XML di postgres

Ini berfungsi:

WITH tbl(p_xml) AS (  -- CTE just to provide test table with xml value
   SELECT '<promotions xmlns="http://www.demandware.com/xml/impex/promotion/2008-01-31">
              <campaign campaign-id="2013-1st-semester-jet-giveaways">
                 <description>2013 1st Semester Jet Giveaways</description>
                 <enabled-flag>true</enabled-flag>
                 <start-date>2013-01-01T05:00:00.000Z</start-date>
                 <end-date>2013-07-01T04:00:00.000Z</end-date>
                 <customer-groups>
                    <customer-group group-id="Everyone"/>
                 </customer-groups>
              </campaign>
           </promotions>'::xml
    )  -- end of CTE, the rest is the solution
SELECT xpath('/n:promotions/n:campaign/n:description/text()', p_xml
           , '{{n,http://www.demandware.com/xml/impex/promotion/2008-01-31}}')
FROM   tbl;

Pengembalian:

{"2013 1st Semester Jet Giveaways"}

Perhatikan bagaimana saya menetapkan alias namespace n untuk namespace Anda di argumen ketiga dari xpath() dan gunakan di setiap level xpath.

Jika Anda menghapus namespace XML dari dokumen, semuanya menjadi lebih sederhana:

WITH tbl(p_xml) AS (  -- not the missing namespace below
   SELECT '<promotions>
              <campaign campaign-id="2013-1st-semester-jet-giveaways">
                 <description>2013 1st Semester Jet Giveaways</description>
                 <enabled-flag>true</enabled-flag>
                 <start-date>2013-01-01T05:00:00.000Z</start-date>
                 <end-date>2013-07-01T04:00:00.000Z</end-date>
                 <customer-groups>
                    <customer-group group-id="Everyone"/>
                 </customer-groups>
              </campaign>
           </promotions>'::xml
   )
SELECT xpath('/promotions/campaign/description/text()', p_xml)
FROM   tbl;

<rant> Apakah hanya saya atau semua orang senang dengan json dan jsonb , jadi kita tidak perlu berurusan dengan XML.</rant>




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengembalikan beberapa nilai dalam suatu fungsi

  2. Masalah dengan Proyek JPA di Eclipse - kesalahan di kelas beranotasi @Entity:Tabel xxx tidak dapat diselesaikan

  3. Buat salinan fungsi C internal PostgreSQL dan muat sebagai fungsi yang ditentukan pengguna

  4. Memuat file CSV (nama file.csv.gz) zip ke tabel PostgreSQL

  5. Menyiapkan Lingkungan Optimal untuk PostgreSQL