Zadejte hledaný výraz...

Simplexml – načtení UTF8 XML s nevalidními znaky

puhy.cz
verified
rating uzivatele
(5 hodnocení)
2. 12. 2014 10:56:18
Zdravím,
mám problém s načtením XML od dodavatele přes simplexml_load_file();
V logu se mi objevuje toto:
Občas jsou ve feedu prostě nevalidní znaky a dodavatel s tím nic neudělá, potřebuji to nějak ošetřit, aby to simple xml načetlo. Řešil to tady někdo?
XML načítám takto:
$sxml=simplexml_load_file($content, null, LIBXML_NOCDATA);
Zkoušel jsem to ještě takto, ale nepomohlo:
$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
Díky.
2. 12. 2014 10:56:18
https://webtrh.cz/diskuse/simplexml-nacteni-utf8-xml-s-nevalidnimi-znaky/#reply1073213
malyprinc
verified
rating uzivatele
(5 hodnocení)
2. 12. 2014 11:14:01
asi bych si ten xml soubor sám modifikoval a všechny texty obalil CDATA viz http://www.w3schools.com/xml/xml_cdata.asp
2. 12. 2014 11:14:01
https://webtrh.cz/diskuse/simplexml-nacteni-utf8-xml-s-nevalidnimi-znaky/#reply1073212
Napadají mě možná řešení:
A:
setlocale(LC_CTYPE, 'cs_CZ.UTF-8');
$file = "sample.xml";
$content = file_get_contents($file);
$content = iconv(mb_detect_encoding($content, mb_detect_order(), true), 'UTF-8//TRANSLIT', $content);
$xml = simplexml_load_string($content);
var_dump($xml);
?>
B:
// kódování ze souboru ... např.: xml version="1.0" encoding="?????"
$dom = new DOMDocument('1.0', 'DEFAULTNI_KODOVANI_XML_SOUBORU');
$dom->load('soubor.xml');
$simple = simplexml_import_dom($dom->documentElement);
?>
C:
setlocale(LC_CTYPE, 'cs_CZ.UTF-8');
function str2utf ($string) {
return mb_convert_encoding($string, 'UTF-8', mb_detect_encoding($string) );
}
$file = "sample.xml";
$xml = new XMLReader;
$xml->open($file);
$doc = new DOMDocument;
while ($xml->read() && $xml->name !== 'NEJAKY_TAG_KE_CTENI');
while ($xml->name === 'NEJAKY_TAG_KE_CTENI')
{
$node = simplexml_import_dom($doc->importNode($xml->expand(), true));
$string = (string) $node->TAG_KTERY_CHCI_CIST;
$result = iconv( mb_detect_encoding( $string, mb_detect_order(), true ), 'UTF-8//TRANSLIT', $string );
//echo $result . "

";
$xml->next('NEJAKY_TAG_KE_CTENI');
}
?>
---------- Příspěvek doplněn 04.12.2014 v 00:51 ----------
tak dej vědět, jestli něco pomůže ....
4. 12. 2014 00:21:57
https://webtrh.cz/diskuse/simplexml-nacteni-utf8-xml-s-nevalidnimi-znaky/#reply1073211
puhy.cz
verified
rating uzivatele
(5 hodnocení)
16. 12. 2014 10:33:38
Díky moc za odpověď. Každopádně A ani B nepomáhá. Končí to vždy na stejných znacích. V error logu je toto:
Pokud by jsi byl ochotný na to kouknout, pošli SZ a domluvíme se (co za to).
16. 12. 2014 10:33:38
https://webtrh.cz/diskuse/simplexml-nacteni-utf8-xml-s-nevalidnimi-znaky/#reply1073210
Smazany ucet 253
verified
rating uzivatele
(3 hodnocení)
16. 12. 2014 11:00:52
tak tahle chyba je způsobena tím, že se v XML vyskytuje neukončený nějaký tag (např. a chybí ). Je to chyba parseru. Pokud s tím dodavatel nic nechce udělat, tak je za 1. idiot a za 2. nemám zdání, jak to řešit opravdu spolehlivě ... Maximálně stáhnout soubor na disk serveru, otevřít pomocí fopen a řádek po řádku kontrolovat tagy pomocí reg exps ...
Ještě zkus soubor jednoduše otevřít pomocí DOMDocument a použít recover a uložit:
$file = 'feed.xml';
$dom = new DOMDocument();
$dom->recover = TRUE;
$dom->load($file);
$dom->save('local.xml');
respektive ještě experimentovat s DOMDocumentem a metody normalizeDocument:
$dom = new DOMDocument();
$dom->validateOnParse = false;
$dom->load($file);
$dom->normalizeDocument();
$dom->save('local.xml');
ještě vyzkoušej normalizovat každý uzel přes: domnode.normalize.php
bohužel nemám tolik času, abych pro tebe mohl udělat víc, jsem v zápřahu ... více o DOMDocument na php.net
---------- Příspěvek doplněn 16.12.2014 v 11:02 ----------
ještě vím, že se na opravu XML souborů používá TIDY, ale nemám s ní žádné osobní zkušenosti
---------- Příspěvek doplněn 16.12.2014 v 11:17 ----------
Toto je z oficiálního zdroje na PHP.net
$html = '

paragraph

';
$tidy = tidy_parse_string($html);
echo tidy_get_error_buffer($tidy);
/* or in OO: */
echo $tidy->errorBuffer;
?>
16. 12. 2014 11:00:52
https://webtrh.cz/diskuse/simplexml-nacteni-utf8-xml-s-nevalidnimi-znaky/#reply1073209
Pro odpověď se přihlašte.
Přihlásit