DOMDocument и преобразование "

Warlock_ua

Новичок
Вот такой код:

PHP:
$xml = new DOMDocument;
$xml->formatOutput = true;

$root = $xml->createElement('root', "\" &quot; < &lt;");
$xml->appendChild($root);

$xml->save("/tmp/test.xml");

Приводит к такому результату:

<?xml version="1.0"?>
<root>" " &lt; &lt;</root>
Вопрос: почему кавычка и &quot; преобразовались в кавычки, а "<" и "&lt" в html entities? И самое главное - как этим управлять? (Мне надо кавычки преобразовать в &quot; в xml-файле)
 

Вурдалак

Продвинутый новичок
Не грузится.

Судя по тому, что это грузится, а вот это: http://yandex.st/help/3.71//js/_help.js — нет, у Яндекса случилось что-то страшное.

Стандарт YML не допускает использования в текстовых данных непечатаемых символов с ASCII-кодами в диапазоне значений от 0 до 31 (за исключением символов с кодами 9, 10, 13 — табуляция, перевод строки, возврат каретки). Это требует обязательной замены некоторых символов на эквивалентные им символьные коды:

Символ в тексте Код для YML-файла

" &quot;
...
— логики в этом я не вижу. Кавычки в этот диапазон не входят. Ты проверял?
 

Warlock_ua

Новичок
У меня всё нормально грузится. И кстати, я нашел метод, как обойти мою проблему:

PHP:
$root = $xml->createElement('root');
$root->appendChild($xml->createEntityReference("quot"));
$root->appendChild($xml->createTextNode(" \" <"));
$xml->appendChild($root);
результат будет такой:

<root>&quot; " &lt;</root>
Но, как по мне, это большой изврат, на каждую кавычку или апостроф добавлять такую конструкцию. Еще, как вариант, обработать готовый xml файл. Но оба решения не красивые. Может кто-то знает красивое решение данной проблемы?
 

Warlock_ua

Новичок
Нет. Обход - не использовать DOMDocument, но у меня тогда не было времени переписывать, поэтому реализовал так:

вызов:
SetElementText($xml, $name, iconv('cp1251', 'UTF-8', $product['name']));

функция:
function SetElementText($xml, $element, $text)
{
$buffer = "";
for($i=0;$i<mb_strlen($text);$i++){
$cur_chr = mb_substr($text, $i, 1);
$add_entity = false;
switch($cur_chr){
case "\"":
$add_entity = true;
$entity = $xml->createEntityReference("quot");
break;
case "'":
$add_entity = true;
$entity = $xml->createEntityReference("apos");
break;

default:
$buffer.=$cur_chr;
}
if($add_entity){
if(mb_strlen($buffer)>0){
$element->appendChild($xml->createTextNode($buffer));
$buffer="";
}
$element->appendChild($entity);
}
}
if(mb_strlen($buffer)>0){
$element->appendChild($xml->createTextNode($buffer));
}
}
 

WMix

герр M:)ller
Партнер клуба
если понимать что <> и & в любом месте текста xml-документа являются ошибкой, а кавычки нельзя использовать только в аттрибутах заключенных в такие же кавычки, все встанет на свои места

к примеру тут ошибка
PHP:
<input value="привет "мир"! " />
так давай убедимся что дом справится!
PHP:
$xml = new DOMDocument;
$xml->formatOutput = true;

$root = $xml->createElement('root', "\" &quot; < &lt;");
$att = $xml->createAttribute('name');
$att->value = 'привет "мир"!';

$root->appendChild($att);
$xml->appendChild($root);

echo $xml->saveXML();
 
Сверху