Článek v rubrikách:

»PHP
»XML

Jak zpracovávat XML dokument, SimpleXML, ale neumí kódování WINDOWS-1250

Zpracovávat XML dokument, procházet, číst a ukládat je dnes nutnost, bez toho se žádný programátor neobejde. Tento článek např. řeší použití knihovny SimpleXML a čtení RSS zdroje.


Pro čtení XML dokumentů často používám php rozšíření SimpleXML, je snadné na používání a v XML dokumentu se lze pohybovat podobně jako v poli hodnot.

Následuje příklad jak číst RSS zdroj. V případě, že chceme změnit výstupní kódování můžeme použít funkci iconv. Vstupní kódování je vždy UTF-8, protože SimpleXML vždy interně pracuje s kódováním UTF. Výstupní kódování je windows-1250, ale můžeme zvolit libovolně podle sebe v proměnné $oC.

  1. $iC = "UTF-8";
  2. $oC = "CP1250";
  3. $url = "http://www.webfaq.cz/rss-clanky.php";
  4.  
  5. if (@$xml = simplexml_load_file($url)) {
  6. foreach ($xml->channel->item as $item) {
  7. $odkaz = iconv($iC, $oC, $item->link);
  8. $nazev = iconv($iC, $oC, $item->title);
  9. $popis = iconv($iC, $oC, $item->description);
  10. echo '<a href="'.$odkaz.'">'.$nazev.'</a>'."<br/>";
  11. echo $popis."<br/>";
  12. }
  13. }

SimpleXML má však i jednu nevýhodu, neumí pracovat s XML dokumenty se vstupním kódováním WINDOWS-1250. V takovém případě je lepší použít funkce DOM.

UPDATE: Při psaní tohoto článku jsem si ověřil platnost výroku, že SimpleXML neumí WINDOWS-1250. Výrok musím vzít zpět! Dle mých testů umí! Přesto, že jsem kdysi s tím měl problémy, opravdu to umí.

Zkusil jsem jednoduchý test, vytvořil jsem soubor napsáný ve windows-1250 kódování a do hlavičky vložil encoding windows-1250.

  1. <?xml version="1.0" encoding="windows-1250"?>
  2. <SHOP><SHOPITEM><PRODUCT>ěščřžýžřě+ěščřžýžřčšě+ěščřžýáíéíáýžřčšě+ ahoj lidi +ěščřžýáííáýžřčšě</PRODUCT></SHOPITEM></SHOP>

Pak jsem vytvořil testovací soubor, který XML dokument čte a vypisuje na obrazovku.

  1. <? $xml=simplexml_load_file($file); ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Untitled Document</title>
  7. </head>
  8. <body>
  9. <? foreach($xml as $k=>$v) echo $v->PRODUCT."<br/>"; ?>
  10. </body>
  11. </html>

Výsledek? Vypsáno na obrazovku:

  1. ěščřžýžřě+ěščřžýžřčšě+ěščřžýáíéíáýžřčšě+ ahoj lidi +ěščřžýáííáýžřčšě

podobné články

01.12.2008Cron a kdo vlastně spouští skript? Démon v pozadí nebo uživatel v prohlížeči?(17%)
27.06.2008XML-RPC přes CURL, aneb jak odeslat XML soubor vzdálené službě, když nemáme allow_url_fopen(17%)
19.06.2008XML a značkovací jazyky, historie a vznik(17%)
07.06.2008Jak zjistit S-Rank pomocí XML-RPC(17%)

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
16.06.2009 10:08 | Anonym (Jirka) | xml importovat do eshopu

Dobrý den,zajímavý web.Jsem totální amatér,mám eshop,založený na Quick.cartu.Mám i dodavatele zboží.Poslal mi odkaz,adresu,na xml soubor.Ten i stáhnu do pc,ale teď vůbec nevím,jak ty data nacpat do eshopu.Můžete mi někdo poradit?Díky email:keramj@seznam.cz

17.06.2009 00:05 | Administrátor | Re: xml importovat do eshopu

Bohužel neznám podrobně quick.cart a jestli má nějaké možnosti importu a definice struktury cizích xml, ale pravděpodobně budete potřebovat vytvořit skript, který bude procházet daný xml soubor a získaná data bude vkládat do databáze. Třeba se tady někdo najde, kdo by měl chvíli času, v opačném případě doporučuji zadat zakázku na http://diskuse.jakpsatweb.cz

01.03.2010 22:28 | Anonym (VASVA) | win1250 -> skutecne nefunguje

tale verze: $xml->addChild(„error“); $xml->error = „Chyba: Nebylo možno určit číslo objednávky.“ a nebo tahle verze: $dom->addChild(„error“,„Chy­ba: Nebylo možno určit číslo objednávky.“); Skutecne nefunguji

04.01.2011 13:58 | Anonym (sqott) | zaloha

zdravicko… mam problem a to tento..vytvoril sem si zalohu bo sem čul se se mi neco s notesem po..tento.ted sem si chtel zalohovane veci hodit zpet ale nejak to nende..vse je v tomto formatu (xml) a nevim co stim mam udelat..sem amater..porad­te..dikec..

SQ

21.09.2011 11:02 | Anonym (imcon) | Jak dekodovat znaky v XMl při načítání ?

Dobrý den, již několik dní se trápím s tím jak načíst XMl soubor abych měl správné kódování. Používám komponentu NativeXML pro Delphi, ale obecně se v XML teprve orientuji a v kódování se nemůžu vyznat.

Soubor, který načítám nemá označené kódování, tedy v XMl deklaraci je: <?xml version=„1.0“ standalone=„yes“?>

Hodnoty entit potom jsou například: <FIELD>([{0|AB}])­</FIELD> <FIELD>Koncová mìrka</FIELD> nebo <FIELD QMLINK=„sNOMSIZE“ UnitList=„UNIT_LEN­GTH_MM|mm|0.0000|||U­NIT_LENGTH_IN­CH|inch|0.000000||“ Label=„sNOMSIZE“/>

Pokud XML načtu do XML editoru (XML Viewer, WMHelp ..) dokáží kódy „{“ dekódovat, i když třeba špatně identifikují kódovou stránku:

<FIELD>Koncová mìrka</FIELD> (místo „Koncová měrka“)

Problém mám s načítáním v programu pomocí NativeXML, kde se mi kódy „{“ nedekódují a protože kódování nerozumím, nevím si rady.

Můžete mi poradit, co je toto za kódování, případně jak s ním pracovat? Pokud má někdo zkušenost s NAtiveXMl (www.simdesign.nl) bylo by to ideální.

Děkuji.

21.09.2011 11:06 | Anonym (imcon) | Jak dekodovat znaky v XMl při načítání ?

Měním formát popisovaných znaků, protože jinak se při vložení příspěvku dekodují (vloženy MEZERY):

Dobrý den, již několik dní se trápím s tím jak načíst XMl soubor abych měl správné kódování. Používám komponentu NativeXML pro Delphi, ale obecně se v XML teprve orientuji a v kódování se nemůžu vyznat.

Soubor, který načítám nemá označené kódování, tedy v XMl deklaraci je: <?xml version=„1.0“ standalone=„yes“?>

Hodnoty entit potom jsou například: <FIELD>([ & # 1 2 3 ;0& # 1 2 4;AB& # 1 2 5 ;])</FIELD> <FIELD>Koncov& # 2 2 5 ; m& # 2 3 6 ;rka</FIELD> nebo <FIELD QMLINK=„sNOMSIZE“ UnitList=„UNIT_LEN­GTH_MM& # 1 2 4 ;mm& # 1 2 4 ;0.0000&# 1 2 4;& # 1 2 4;& # 1 2 4;UNIT_LENGTH_INCH& # 1 2 4;inch& # 1 2 4;0.000000|& # 1 2 4;“ Label=„sNOMSIZE“/>

Pokud XML načtu do XML editoru (XML Viewer, WMHelp ..) dokáží kódy „& # 1 2 3 ;“ dekódovat, i když třeba špatně identifikují kódovou stránku:

<FIELD>Koncová m& # 2 3 6 ;rka</FIELD> (místo „Koncová měrka“)

Problém mám s načítáním v programu pomocí NativeXML, kde se mi kódy „& # 1 2 3 ;“ nedekódují a protože kódování nerozumím, nevím si rady.

Můžete mi poradit, co je toto za kódování, případně jak s ním pracovat? Pokud má někdo zkušenost s NAtiveXMl (www.simdesign.nl) bylo by to ideální.

Děkuji.

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>