PHP добавляет нежелательные

#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 Я не запускал этот код, возможно, есть некоторые ошибки. Это просто направление для решения вашей проблемы