Cum se poate exporta XML din MySql unescaped – fără conversia caracterelor speciale?

Mă strădui să export content dintr-un CMS legacy către XML (pentru import în Wordpress).
Problema-mi e că la export sunt convertite caracterele speciale în entități – inclusiv parantezele tag-urilor HTML
Ex: <br />&lt;br /&gt;

Am încercat și din phpMyAdmin și din cli (cu opțiunea --xml)

E o problema destul de complexa fiindca de vina e charset-ul.
Incearca sa folosesti : --skip-set-charset --default-character-set=latin1 la mysqldump.

Preferabil la default character set pui utf8 sau ce ai acum, daca ai latin1 exista ceva collation (lipsa de caractere) pe conversie la utf-8.

Nu folosi phpmyadmin pentru backup fiindca si phpmyadmin are o setare pentru charset, php iarasi.
Ai grija si la editorul tau de text, sa nu il schimbe cumva.

1 Like

Cred ca mai simplu e sa citesti acea tabela din cms si apoi sa o introduci ptin in wordpress.

Daca lucru asta trebuie facut regulat, atunci, mai simplu, faci un mic serviciu Web pe CMS si il executi in WP (JSON saun XML)

Asa simplifici problema.

In cazul unui singur import (portare pe WP), prelucreaza tabelele din CMS si nu te chinui cu import, export…

Spor!

1 Like

Nu cred ca vrei una cu asta.
Formatul XML e mai restrictiv decat HTML si tu vrei ca tot ce se exporta sa fie XML valid ceea ce nu prea e cazul. Mai repede fa o procesara ulterioara la citire, librariile XML au functii care vor face conversia automat atunci cand citesti un anumit nod.

1 Like

Am hotărât să fac importul via WordPress XML (WXR) pentru că mi se pare mai ieftin, overall. Pare mai puțină bătaie de cap să generez un XML conform decât să țin minte ID-uri, să stau să refac în db toate legăturile cu media și taxonomii.

În alte cazuri similare (migrare proprietary CMS → WP) direct în wp_db, de data asta mă încurcă ceva weird encoding al conținutului, contentul original e nominal în db ISO 8859-2 dar de fapt pare salvat parțial ISO 8859-2 , parțial UTF-8, cert e că la export via php ajung la caractere (diferite) bușite, și dacă le tratez ISO 8859-2 și dacă le tratez UTF-8. M-am mai lovit de situații relativ similare în trecut și țin minte că a luat o perioadă să rezolv deranjul cu encodingul.

La export XML din MySql cumva totul e transformat cu succes și rezultatul e ca prin minune UTF-8.

Soluția la care am ajuns momentan, e să export XML direct din mysql cli, transform cu XSL în format WXR după care înlocuiesc o listă caracterele dubioase și adaug CDATA pentru unde e cazul (ceea ce nu mi-a ieșit direct cu XSL)

sed -e 's/\&amp;/\&/g' -e 's/&lt;/</g' -e 's/&gt;/>/g' -e 's/&quot;/"/g' -e 's/&ldquo;/"/g' -e 's/&rdquo;/"/g' -e 's/&#8221;/"/g' -e 's/&#8222;/"/g' -e 's/&#8211;/-/g' -e 's/&#355;/ț/g' -e 's/&#259;/ă/g' -e 's/&#351;/ș/g' -e 's/&#183;/·/g' -e 's/&#8220;/"/g' -e 's/&#227;/ă/g' -e 's/<content:encoded>/<content:encoded><![CDATA[/g' -e 's/<\/content:encoded>/]]><\/content:encoded>/g' -e 's/<title>/<title><![CDATA[/g' -e 's/<\/title>/]]><\/title>/g' -e 's/<excerpt:encoded>/<excerpt:encoded><![CDATA[/g' -e 's/<\/excerpt:encoded>/]]><\/excerpt:encoded>/g' exported_articles.xml > wp_articles.xml