DOMDocument-> createTextNode, чтобы не кодировать XML - PullRequest
1 голос
/ 11 октября 2011

У меня есть XML, который мне нужен, чтобы пользователь мог редактировать (внутри textarea) по своему вкусу и затем читать его в DOMDocument. Вот что у меня есть.Теперь выходные данные кодируют переменную $string, и это не очень хорошо для меня, так как я хочу, чтобы пользователь мог добавлять XML и строку в мой DOMDocument.превратить текст в элемент, или я лаю не на том дереве.

Ответы [ 2 ]

4 голосов
/ 11 октября 2011

Вам нужно создать DOMDocumentFragment вместо элемента. Когда вы устанавливаете текст элемента - как вы делаете с помощью метода createElement - это кодируется HTML. Это правильное поведение. Если вы хотите включить произвольный XML, используйте createDocumentFragment и appendXML:

<?php

$dom = new DOMDocument();
$dom->formatOutput = true;      //Formating the output
$ele = $dom->createElement("someele", "Hello");
$dom->appendChild( $ele );

$string = "<yowhatsup><noway>some text</noway></yowhatsup>";

$frag = $dom->createDocumentFragment();
$frag->appendXML($string);
$dom->appendChild( $frag );

Но будьте очень осторожными, чтобы санировать данные, поступающие от вашего пользователя. Если вы плохо очистите, у вас получится XSS-уязвимость, позволяющая вставлять произвольный контент.

2 голосов
/ 11 октября 2011

Вы можете использовать DOMDocumentFragment и его метод appendXML () , например

<?php
$doc = new DOMDocument();
$doc->formatOutput = true;
$ele = $doc->createElement("someele", "Hello");
    $xmlstuff = $doc->createElement("otherxmlstuff");

        $fragment = $doc->createDocumentFragment();
        $fragment->appendXML("<foo>text</foo><bar>text2</bar>");
        $xmlstuff->appendChild($fragment);

    $ele->appendChild($xmlstuff);
$doc->appendChild( $ele );
echo $doc->saveXML();

печать

<?xml version="1.0"?>
<someele>Hello<otherxmlstuff><foo>text</foo><bar>text2</bar></otherxmlstuff></someele>
...