#php #xml #dom #simplexml
#php #xml #dom #simplexml
Вопрос:
Я хотел бы сохранить содержимое текстовой области в XML, но по какой-то причине PHP добавляет amp;#xD;
в вывод XML:
<?
$products = simplexml_load_file('data/custom.xml');
$product = $products->addChild('product');
$product->addChild('description', nl2br($_POST['description']));
//format XML output, simplexml can't do this
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($products->asXML());
file_put_contents('data/custom.xml', $dom->saveXML());
?>
<textarea class="form-control" id="description" name="description" placeholder="Description" rows="4"></textarea>
Я использую nl2br()
функцию, потому что хочу преобразовать символы новой строки в <br>
, но почему она добавляет (или оставляет?) символ новой строки amp;#xD;
в выводе?
Пример вывода:
<?xml version="1.0"?>
<products>
</product>
<product>
<description>mfgdganamp;<br /amp;>amp;#xD;
1amp;<br /amp;>amp;#xD;
2amp;<br /amp;>amp;#xD;
3</description>
</product>
</products>
Комментарии:
1. Это не сработает, потому
<br>
что это тег. Вам нужно использовать CDATA .
Ответ №1:
amp;#xD;
это возврат каретки, а не перевод строки.
В любом случае, nl2br()
функция вставляет разрывы строк перед новыми строками в строке; это не заменяет их.
Попробуйте использовать:
str_replace(array("rn", "r", "n"), "<br/>")
или что-то подобное вместо nl2br()
.
Ответ №2:
SimpleXMLElement не имеет возможности напрямую добавлять теги xml. Это означает, что ваши нежелательные теги — это просто закодированные символы. Но в семействе функций DOM доступно прямое добавление тегов xml. К счастью, легко работать с SimpleXML и DOM одновременно в одном и том же XML-документе.
В приведенном ниже примере фрагмент документа используется для добавления пары элементов в документ.
$products = simplexml_load_file('data/custom.xml');
$product = $products->addChild('product');
$description = $product->addChild('description');
$dom = dom_import_simplexml($description);
$fragment = $dom->ownerDocument->createDocumentFragment();
$fragment->appendXML(nl2br($_POST['description']));
$dom->appendChild($fragment);
echo $description->asXML();
PS Я не запускал этот код, возможно, есть некоторые ошибки. Это просто направление для решения вашей проблемы