我有XML,我需要用户能够根据自己的喜好编辑(在textarea
内),然后将其读取到DOMDocument这是我到目前为止所拥有的。
$dom = new DOMDocument();
$dom->formatOutput = true; //Formating the output
$ele = $dom->createElement("someele", "Hello");
$dom->appendChild( $ele );
$string = "<yowhatsup><noway>some text</noway></yowhatsup>";
$ele = $dom->createElement("otherxmlstuff", $string);
$dom->appendChild( $ele );
现在输出对$string
变量进行编码,这对我不利,因为我希望用户能够将xml和字符串添加到我的DOMDocument中。
我是否可以进行一些预处理以将文本转换为元素,或者我正在咆哮错误的树。
答案 0 :(得分:4)
您需要创建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漏洞,允许插入任意内容。
答案 1 :(得分:2)
您可以使用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>