Разбор XML с одинарными кавычками? - PullRequest
0 голосов
/ 25 сентября 2008

В настоящее время я сталкиваюсь с проблемой, когда элемент возвращается из моего XML-файла с одинарной кавычкой. Это приводит к тому, что xml_parse разбивает его на несколько частей, например: Get Wired, You're Hired! Затем он интерпретируется как «Get Wired, You» - один объект, одиночная кавычка - второй, и «Hired!» как третий.

Что я хочу сделать, это:

while($data = fread($fp, 4096)){
        if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
            break;
        }
    }

Но это продолжает ломаться. Я могу запустить str_replace вместо htmlentities, и он работает без проблем, но не хочет с htmlentities.

Есть идеи?

Обновление: Согласно ответу JimmyJ, приведенному ниже, я безуспешно пытался найти следующее решение (к вашему сведению, есть ответ или два над ссылками, которые обновляют код, связанный напрямую):

function XMLEntities($string)
    {
        $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
        return $string;
    }

    function _privateXMLEntities($num)
    {
    $chars = array(
        39  => ''',
        128 => '€',
        130 => '‚',
        131 => 'ƒ',
        132 => '„',
        133 => '…',
        134 => '†',
        135 => '‡',
        136 => 'ˆ',
        137 => '‰',
        138 => 'Š',
        139 => '‹',
        140 => 'Œ',
        142 => 'Ž',
        145 => '‘',
        146 => '’',
        147 => '“',
        148 => '”',
        149 => '•',
        150 => '–',
        151 => '—',
        152 => '˜',
        153 => '™',
        154 => 'š',
        155 => '›',
        156 => 'œ',
        158 => 'ž',
        159 => 'Ÿ');
        $num = ord($num);
        return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
    }
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
            break;
        }

Обновление: В соответствии с вопросом Тома ниже, магические кавычки действительно отключены.

Решение: Я решил решить эту проблему следующим образом:

После сбора данных для каждого отдельного элемента / записи / и т. Д. Я сохраняю эти данные в массиве, который позже буду использовать для вывода, а затем очищаю локальные переменные, используемые во время сбора. Я добавил шаг, который проверяет, есть ли уже данные, и если да, я объединяю их до конца, а не перезаписываю.

Итак, если у меня получится три куска (как указано выше, давайте придерживаться фразы «Получи, ты нанят!»), Тогда я перейду к выполнению

$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'

Для выполнения:

$x = 'Get Wired, You' . "'" . 're Hired!'

Это не оптимальное решение, но, похоже, работает.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2008

Я думаю, что включение волшебных кавычек может иногда испортить анализ XML - это включено? Вы можете отключить это во время выполнения, используя

set_magic_quotes_runtime(0);

Редактировать: это может не относиться к делу, если источник не является отправкой или получением, но я прочитал в руководстве по PHP, что это может вызвать странное поведение в любом случае

1 голос
/ 30 сентября 2008

Почему бы вам не использовать что-то вроде simplexml_load_file для простого анализа вашего файла?

...