gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:44:58 24 4
gpt4 key购买 nike

我正在使用 CakePHP 的 Xml core library 在 View 中生成 XML :

$xml = Xml::build($data, array('return' => 'domdocument'));
echo $xml->saveXML();

View 是从带有数组的 Controller 馈送的:

$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

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

我是做错了什么还是只是遇到了 CakePHP 中的错误?

最佳答案

这是一个 bug在 PHPs DOMDocument::createElement() 方法中。这里有两种方法可以避免这个问题。

创建文本节点

单独创建textnode并将其附加到元素节点。

$dom = new DOMDocument;
$dom
->appendChild($dom->createElement('element'))
->appendChild($dom->createTextNode('S & T: ERROR'));

var_dump($dom->saveXml());

输出:

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

这是将文本节点添加到 DOM 的最初预期方式。您始终创建一个节点(元素、文本、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>

属性 DOMNode::$textContent

DOM Level 3 引入了一个名为 textContent 的新节点属性。它根据节点类型抽象节点的内容/值。设置元素节点的 $textContent 会将其所有子节点替换为单个文本节点。读取它会返回所有后代文本节点的内容。

$dom = new DOMDocument;
$dom
->appendChild($dom->createElement('element'))
->textContent = 'S & T: ERROR';

var_dump($dom->saveXml());

关于php - CakePHP Xml 实用程序库触发 DOMDocument 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22956330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com