Návrh na XML parser pro Nette\Utils
- Tomáš Jacík
- Člen | 147
Nette\Utils již má třídu pro práci s JSONem. Parsování XML (hlavně zpracování chyb) je u SimpleXML také otrava. Rád bych tedy v Nette\Utils viděl třídu i pro parsování XML. Sám používám něco takového:
class SimpleXMLParser extends Nette\Object
{
public static function parse($xml)
{
$currentState = libxml_use_internal_errors(TRUE);
$xml = simplexml_load_string($xml);
if (!$xml) {
$errors = libxml_get_errors();
libxml_clear_errors();
libxml_use_internal_errors($currentState);
throw new SimpleXMLParserException('Error processing xml', $errors);
}
libxml_use_internal_errors($currentState);
return $xml;
}
}
class SimpleXMLParserException extends \Exception
{
static private $levels = [
LIBXML_ERR_WARNING => 'Warning: ',
LIBXML_ERR_ERROR => 'Error: ',
LIBXML_ERR_FATAL => 'Fatal: ',
];
/** @var array */
private $errors;
public function __construct($message = NULL, array $errors = [])
{
parent::__construct($message);
$this->errors = $errors;
}
public function getErrors()
{
$errors = [];
foreach ($this->errors as $error) {
$errors[] = self::$levels[$error->level] . trim($error->message) .
" on line {$error->line} column {$error->column}";
}
return $errors;
}
}
Rád bych znal Vaše názory, připomínky, abych to mohl lépe zpracovat a poslat pull.
- Jan Tvrdík
- Nette guru | 2595
Xml už skoro nikdo nepoužívá =)
Jinak tohle používá Symfony
https://github.com/…lEncoder.php#…
- Filip Procházka
- Moderator | 4668
@TomasJancik tak udělej extension. A než se zeptáš tak ne, mít tam jenom dvě třídy není vůbec nic divného.
Xml už skoro nikdo nepoužívá =)
@JanTvrdík to je hovadina :)
- Tomáš Jacík
- Člen | 147
@JanTvrdík To řekni bankám a jiným institucím :D Za ten odkaz díky.
@FilipProcházka To bych sice mohl, ale raději bych to viděl právě v Nette\Utils aby to prospělo více lidem. Nenavrhuji to pro sebe, pro sebe to mám vyřešeno, chtěl bych udělat Nette o fous lepším nástrojem.
- Tomáš Jacík
- Člen | 147
@JanEndel Matcher znám, ale na XML jsem to tedy použít nezkoušel. Budu muset vyzkoušet.
- Casper
- Člen | 253
Již nějakou dobu používám tuhle implementaci, třeba bude vyhovovat i někomu dalšímu (@yonix, @TomášJacík, …). Výstupem je DomDocument, ne SimpleXmlElement, protože u něj se mi nepodařilo napsat ochranu proti útoku QuadraticBlowup, nicméně DomDocument lze snadno převést na SimpleXmlElement pomocí php funkce simplexml_import_dom.