PHP - Обработка недопустимого XML

Я использую SimpleXML для загрузки в некоторых XML-файлах (который я не писал/обеспечивал и не могу действительно изменить формат).

Иногда (например, один или два файла из каждых приблизительно 50) они не выходят ни из каких специальных символов (главным образом и, но иногда другие случайные недопустимые вещи также). Это создает и проблема, потому что SimpleXML с php просто перестал работать, и я действительно не знаю ни о каком хорошем способе обработать анализирующий недопустимый XML.

Моя первая идея состояла в том, чтобы предварительно обработать XML как строку и вставить ВСЕ поля как CDATA, таким образом, это будет работать, но по некоторой безбожной причине XML, который я должен обработать, помещает все свои данные в полях атрибута. Таким образом я не могу использовать идею CDATA. Пример XML того, чтобы быть:

 <Author v="By Someone & Someone" />

Что лучший способ состоит в том, чтобы обработать это для замены всех недопустимых символов от XML, прежде чем я загружу его в SimpleXML?

5
задан Paul 22 May 2010 в 23:16
поделиться

1 ответ

Что вам нужно, так это то, что будет использовать внутренние ошибки libxml для поиска недопустимых символов и соответствующего их экранирования. Вот макет того, как бы я это написал. Взгляните на результат libxml_get_errors () для получения информации об ошибке.

function load_invalid_xml($xml)
{
    $use_internal_errors = libxml_use_internal_errors(true);
    libxml_clear_errors(true);

    $sxe = simplexml_load_string($xml);

    if ($sxe)
    {
        return $sxe;
    }

    $fixed_xml = '';
    $last_pos  = 0;

    foreach (libxml_get_errors() as $error)
    {
        // $pos is the position of the faulty character,
        // you have to compute it yourself
        $pos = compute_position($error->line, $error->column);
        $fixed_xml .= substr($xml, $last_pos, $pos - $last_pos) . htmlspecialchars($xml[$pos]);
        $last_pos = $pos + 1;
    }
    $fixed_xml .= substr($xml, $last_pos);

    libxml_use_internal_errors($use_internal_errors);

    return simplexml_load_string($fixed_xml);
}
7
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: