2013-08-20 1 views
1

Я пишу PHP-скрипт для создания некоторых документов XML, и у меня возникают некоторые проблемы с SimpleXML и кавычками.PHP SimpleXMLElement не делает кавычки в сущности

Если у меня есть такой код:

$xml = new SimpleXMLElement('<myxml />'); 
$xml->addChild('title','My Feed'); 
$xml->addChild('description','Entity data here - &amp; &quot; &apos;'); 

Если я print_r в $ XML OBJ тогда я получаю это:

print_r($xml); 
SimpleXMLElement Object 
(
    [title] => My Feed 
    [description] => Entity data here - & " ' 
) 

Что кажется, что когда-то в объекте он делает объекты обратно в их соответствующих персонажей. Однако, когда я называю asXML() на объекте, чтобы получить XML он показывает мне это:

echo $xml->asXML(); 
<?xml version="1.0"?> 
    <myxml> 
    <title>My Feed</title> 
    <description>Entity data here - &amp; " '</description> 
</myxml> 

Это делает & обратно в сущности, но, кажется, оставить кавычки как символы. Разве они не должны превращать их в сущности?

ответ

4

" и ' являются только специальными символами в XML, если они находятся внутри значения атрибута. В текстовом содержимом элемента нет никакой двусмысленности относительно значения " или ', поскольку следующий специальный токен, который ищет, - <, чтобы начать открытие или закрытие тега.

Таким образом, хотя <foo bar="hello "world"" /> недействителен XML, <foo>hello "world"</foo> нет, поэтому не миновать не требуется.

(Просто потому, что не требуется , не означает, что это не возможно, так что может быть более полного ответа на вопрос о том, почему SimpleXML не по крайней мере, сохранить примитивов, которые вы бы положить туда добровольно.)

0

Похоже, проблема немного глубже: https://bugs.php.net/bug.php?id=49437

это «особенность» или ошибка в основной LibXML библиотеки: по умолчанию все объекты (за исключением ЛТ и &) не имеют границ.

Ирония заключается в том, что вы можете явно включить unescaping (LIBXML_NOENT), но вы не можете его отключить.

Я нашел единственный способ справиться с этим: используйте CData узлы, где данные остались нетронутыми, как есть. Конечно, это не идеальное решение.

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

  • Нет связанных вопросов^_^