【问题标题】:DOMDocument->createTextNode not to encode XMLDOMDocument->createTextNode 不编码 XML
【发布时间】:2011-10-11 12:15:20
【问题描述】:

我有 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 中。

我可以做一些预处理来把文本变成一个元素吗,还是我找错了树。

【问题讨论】:

  • 该 XML 应该是文档的一部分还是应该是某个元素的数据?您是否希望它与文档中的其他 XML 一起被解析,例如getElementsByTagName('yowhatsup') 应该找到它吗?还是应该是一个孤立的数据?如果是第一个,请参阅下面的答案。如果是后者,请搜索 SO 以了解如何使用 DOM 添加 CDATA 部分。

标签: php xml domdocument


【解决方案1】:

您需要创建一个DOMDocumentFragment 而不是一个元素。当您设置元素的文本时——就像使用createElement 方法一样——它是HTML 编码的。这是正确的行为。如果要包含任意 XML,请使用 createDocumentFragmentappendXML

<?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】:

    您可以使用 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>
    

    【讨论】:

      猜你喜欢
      • 2012-02-05
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 2017-01-18
      • 2015-01-11
      • 1970-01-01
      • 2014-12-29
      • 2014-05-25
      相关资源
      最近更新 更多