Chyba String could not be parsed as XML

Nedávno jsem dostal dotaz ohledně chyby String could not be parsed as XML, která se vyskytla u jednoho pluginu. Než jsem se na to stihl podívat už vše fungovalo. Důvodem bylo to, že tato chyba se většinou nenachází přímo v skriptu pluginu, ale v datech, s kterými pracuje. Ale to si projdeme postupně.

Co je to XML #

XML znamená Extensible Markup Language a jedná se o speciální formát zápisu dat, tak aby jej dokázal pochopit a zpracovat jak člověk, tak i stroj. Jedná se tedy o strojově čitelný zápis nějakých informací. Pomocí souboru v XML si mezi sebou mohou dva skripty či programy vyměňovat data a umět je zpracovat. Využívá se například pro komunikaci webu s Google.

Jednoduchý příklad jak vypadá XML soubor, který obsahuje statistiky a informace o instalaci WordPress

<?xml version="1.0" encoding="UTF-8"?>
<wordpress>
  <verze>4.6</verze>
  <stranek>3</stranek>
  <clanku>107</clanku>
  <komentaru>42</komentaru>
</wordpress>

Pokud by si kdokoliv tento soubor stáhl, tak uvidí data a zároveň bude vědět, co znamenají. Využít by se mohl například pro mobilní aplikaci, která bude zobrazovat aktuální statistiky. Po spuštění by si tento soubor stáhla, zpracovala data a zobrazila je. Aplikace bude vědět co jednotlivé údaje znamenají, protože jsou popsané. Takto popsaná data může využít ale kdokoliv. Jsou totiž univerzální. A o tom přesně XML je.

Co je zač chyba String could not be parsed as XML #

XML je mezinárodní formát a proto s ním různé programovací jazyky umí pracovat. Mají na to vlastní funkce, takže stačí pár řádků kódů a všechno máte připravené pro dalších práci. Tohle platí i pro PHP ve kterém je WordPress napsaný.

Když při zpracovávání těchto dat dojde k chybě tak se objeví chybová hláška String could not be parsed as XML. Tedy celá tato chyba není nic jiného, než že PHP nemůže soubor s daty v XML zpracovat.

Předpokládáme li, že skript tato data nijak neupravuje předtím než je zpracuje, tak chyba je čistě v datech. Například je někde překlep anebo jak se často stává chybí zpětné lomítko.

Jak chybu String could not be parsed as XML opravit #

Jak už bylo zmíněno výše, většinou je chyba čistě ve formátu dat v XML souboru. Proto je třeba otestovat tento soubor na chyby. Využít můžete třeba validátor od w3schools.com. Samozřejmě pro větší soubory o velikosti několik megabajtů už se nehodí. Ovšem zde pomůže i moderní prohlížeč, který s daty v XML umí pracovat a zobrazit je. V případě chyby v souboru pak data nezobrazí správně.

Chybu v souboru XML může způsobit více věcí. Například se špatně stáhl, při generování došlo k chybě anebo do něj bylo vloženo něco co tam být nemá (malware).

Pokud je chyba ve staženém XML souboru je nutné jej stáhnout znovu. Jestliže je opět poškozený, tak je nutné kontaktovat toho, kdo XML soubor poskytl a požádat jej ať chybu opraví. Plugin jinak nedokáže XML soubor spracovat.

Jestliže je soubor v pořádku, tak chyba může být buď mezi serverem ze kterého se stahuje a instalací anebo přímo v instalaci. U první varianty je nutné zjistit co se vlastně stáhlo. Pokud se soubor neukládá dočasně na disk, tak bez základů programování to nedáte. Jestliže programovat umíte, tak si vytvořte jednoduchý skriptík, který se připojí na server se zdrojem, stáhne obsah a zobrazí jej. V nejhorším by měla stačit i PHP funkce file_get_contents. Ale pozor na velikost stahovaného souboru.

V druhém případě je nutné zjistit, co se s daty děje. Můžete se například stát, že se XML soubor stáhne, nějaký jiný plugin do něj něco umístí a pak neproběhne správně zpracování (parsování). Tohle dělá například malware. V tomto případě zkuste všechny pluginy vypnout a zjistit, který by to mohl dělat. Nějaké detailnější sledování už je celkem náročná záležitost a bez profesionálního programátora, který má zkušenosti s WordPress, to nezjistíte.

Pozor na cache #

Výsledkem chybného zpracování je chybová hláška. Jestliže používáte nějaký druh cache, tak se výstup uloží do cache a bude zobrazovat i když už došlo k nápravě. Takže je třeba vyprázdnit cache a zastavit cachování či úplně vypnout cachovací plugin.