2008-09-25 5 views
0

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

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

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

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

Любые идеи?

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

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!' 

делать "Get Wired, Вы Наемные!:

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

Это не является оптимальным решением, но, кажется, работает

ответ

1

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

2

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

set_magic_quotes_runtime(0); 

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

Смежные вопросы