当前位置: 首页 > 面试题库 >

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

柴英光
2023-03-14
问题内容

我正在使用CakePHP的Xml核心库在视图中生成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 [CORE\Cake\Utility\Xml.php, line 292

…因为(如记录所示)DOMDocument::createElement不会转义值。但是,如测试用例所示,它仅在某些节点中执行此操作。

我是在做错什么,还是刚遇到CakePHP中的错误?


问题答案:

问题似乎出在具有属性和值的节点中,因此需要使用以下@语法:

'@id' => 'A & B: OK',  // <-- Handled as plain text
'name' => 'C & D: OK', // <-- Handled as plain text
'@' => 'S & T: ERROR', // <-- Handled as raw XML

我写了一些辅助函数:

protected function escapeXmlValue($value){
    return is_null($value) ? null : htmlspecialchars($value, ENT_XML1, 'UTF-8');
}

…并在创建数组时注意手动调用它:

'@id' => 'A & B: OK',
'name' => 'C & D: OK',
'@' => $this->escapeXmlValue('S & T: NOW WORKS FINE'),

由于文档中没有提及它,因此很难说它是错误还是功能。



 类似资料:
  • 在本节中,介绍了在MySQL 5.1中使用触发程序的方法,并介绍了在使用触发程序方面的限制。 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。 触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。可以将触发程序设置为在执行语句之前或之后激活。例如,可以在从表中

  • 配置报警策略的时候open-falcon支持多种报警触发函数,比如all(#3) diff(#10)等等。 这些#后面的数字表示的是最新的历史点,比如#3代表的是最新的三个点。该数字默认不能大于10,大于10将当作10处理,即只计算最新10个点的值。 说明:#后面的数字的最大值,即在 judge 内存中保留最近几个点,是支持自定义的,具体参考 book 中描述 ; 源码位置 => cfg.exam

  • 目录 21.1. CREATE TRIGGER语法 21.2. DROP TRIGGER语法 21.3. 使用触发程序 MySQL 5.1包含对触发程序的支持。触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如,下述语句将创建1个表和1个INSERT触发程序。触发程序将插入表中某一列的值加在一起: mysql> CREATE TABLE account (acct_num

  • 问题内容: 我一直在尝试解析HTML5代码,以便可以在代码内设置属性/值,但是DOMDocument(PHP5.3)似乎不支持诸如和的标记。 有什么方法可以在PHP中将其解析为HTML并处理代码? 复制代码: 错误 警告:DOMDocument :: loadHTML():在实体中的标签导航无效,第17行在/home/wbkrnl/public_html/new- mvc/1.php中的第4行 警

  • 配置报警策略的时候open-falcon支持多种报警触发函数,比如all(#3) diff(#10)等等,这些#后面的数字表示的是最新的历史点。比如#3代表的是最新的三个点。 all(#3): 最新的3个点都满足阈值条件则报警 max(#3): 对于最新的3个点,其最大值满足阈值条件则报警 min(#3): 对于最新的3个点,其最小值满足阈值条件则报警 sum(#3): 对于最新的3个点,其和满足

  • 本文向大家介绍Android开发实例之多点触控程序,包括了Android开发实例之多点触控程序的使用技巧和注意事项,需要的朋友参考一下        智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣。实际上多点触控程序的实现并不是那么遥不可及,而是比较容易。本文就主要通过一个实例具体讲解多点触控程序的实现。        首先来了解一