У PHP нет функции для XML-безопасного декодирования объектов? У вас нет xml_entity_decode?

ПРОБЛЕМА: Мне нужен XML-файл, "полностью закодированный" UTF8; то есть без сущности, представляющей символы, все символы, заключенные в UTF8, за исключением только 3-х, которые зарезервированы для XML, "&" (amp), "<" (lt) и ">" (gt). А также,мне нуженвстроенные функция, которая делает это быстро: преобразовать сущности в реальные символы UTF8 (без искажения моего XML).
PS: это «проблема реального мира» (!); вPMC / журналынапример, 2,8 млн научных статей,специальный XML DTD (известен также какФормат JATS) ... Чтобы обработать как "обычный XML-UTF8-текст", нам нужно перейти от числовой сущности к символу UTF8.

ПОПЫТКА РЕШЕНИЯ: естественная функция для этой задачиhtml_entity_decode, но он уничтожает код XML (!), преобразуя зарезервированные 3 зарезервированных символа XML.

Иллюстрируя проблему

предполагать

  $xmlFrag ='<p>Hello world! &#160;&#160; Let A&lt;B and A=&#x222C;dxdy</p>';

Где объекты 160 (nbsp) и x222C (двойной интеграл) должны быть преобразованы в UTF8, а XML-зарезервированыlt не. Текст XML будет (после преобразования),

$ xmlFrag = '<p>Привет, мир! Пусть А&lt;B и A = xdxdy</p>«;

Текст "A <B" требует зарезервированного символа XML, поэтому ДОЛЖЕН оставатьсяA&lt;B.

Разочарованные решения

Я пытаюсь использоватьhtml_entity_decode для решения (напрямую!) проблемы ... Итак, я обновил свой PHP до v5.5, чтобы попытаться использоватьENT_XML1 вариант,

  $s = html_entity_decode($xmlFrag, ENT_XML1, 'UTF-8'); // not working
                                                        // as I expected

Возможно, другой вопрос,"Почему нет другого варианта сделать то, что я ожидал?" - это важно для многих других приложений XML (!), не только для меня.

Мне не нужнаобходной путь как ответ ... Хорошо, я показываю свою уродливую функцию, возможно, это поможет вам понять проблему,

  function xml_entity_decode($s) {
    // here an illustration (by user-defined function) 
    // about how the hypothetical PHP-build-in-function MUST work
    static $XENTITIES = array('&amp;','&gt;','&lt;');
    static $XSAFENTITIES = array('#_x_amp#;','#_x_gt#;','#_x_lt#;');
    $s = str_replace($XENTITIES,$XSAFENTITIES,$s); 

    //$s = html_entity_decode($s, ENT_NOQUOTES, 'UTF-8'); // any php version
    $s = html_entity_decode($s, ENT_HTML5|ENT_NOQUOTES, 'UTF-8'); // PHP 5.3+

    $s = str_replace($XSAFENTITIES,$XENTITIES,$s);
    return $s;
  }  // you see? not need a benchmark: 
     //  it is not so fast as direct use of html_entity_decode; if there 
     //  was an XML-safe option was ideal.

PS: исправлено послеэтот ответ, Должно бытьENT_HTML5 флаг, для преобразованияна самом деле все именованные объекты.

Ответы на вопрос(5)

Ваш ответ на вопрос