加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

CakePHP Xml实用程序库触发DOMDocument警告

发布时间:2020-12-13 18:20:51 所属栏目:PHP教程 来源:网络整理
导读:我在Cake PHP的 Xml core library视图中生成XML: $xml = Xml::build($data,array('return' = 'domdocument'));echo $xml-saveXML(); 视图由带有阵列的控制器提供: $this-set( array( 'data' = array( 'root' = array( array( '@id' = 'A B: OK','name' = '
我在Cake PHP的 Xml core library视图中生成XML:
$xml = Xml::build($data,array('return' => 'domdocument'));
echo $xml->saveXML();

视图由带有阵列的控制器提供:

$this->set(
    array(
        'data' => array(
            'root' => array(
                array(
                    '@id' => 'A & B: OK','name' => 'C & D: OK','sub1' => array(
                        '@id' => 'E & F: OK','name' => 'G & H: OK','sub2' => array(
                            array(
                                '@id' => 'I & J: OK','name' => 'K & L: OK','sub3' => array(
                                    '@id' => 'M & N: OK','name' => 'O & P: OK','sub4' => array(
                                        '@id' => 'Q & R: OK','@'   => 'S & T: ERROR',),)
);

无论出于何种原因,CakePHP发出如下内部调用:

$dom = new DOMDocument;
$key = 'sub4';
$childValue = 'S & T: ERROR';
$dom->createElement($key,$childValue);

…触发PHP警告:

Warning (2): DOMDocument::createElement(): unterminated entity reference               T [CORECakeUtilityXml.php,line 292

…因为(as documented),DOMDocument :: createElement不会转义值.但是,正如测试案例所示,它仅在某些节点中执行.

我做错了什么或者我只是在CakePHP中遇到了一个错误?

这可能是PHP的DOMDocument :: createElement()方法中的 bug.你可以避免它.单独创建textnode并将其附加到元素节点.
$dom = new DOMDocument;
$dom
  ->appendChild($dom->createElement('element'))
  ->appendChild($dom->createTextNode('S & T: ERROR'));

var_dump($dom->saveXml());

产量:https://eval.in/134277

string(58) "<?xml version="1.0"?>
<element>S &amp; T: ERROR</element>
"

这是将文本节点添加到DOM的预期方法.您始终创建一个节点(element,text,cdata,…)并将其附加到其父节点.您可以向一个父节点添加多个节点和不同类型的节点.如下例所示:

$dom = new DOMDocument;
$p = $dom->appendChild($dom->createElement('p'));
$p->appendChild($dom->createTextNode('Hello '));
$b = $p->appendChild($dom->createElement('b'));
$b->appendChild($dom->createTextNode('World!'));

echo $dom->saveXml();

输出:

<?xml version="1.0"?>
<p>Hello <b>World!</b></p>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读