我正在使用 simpleXML 在我的一个 XML 文档中添加一个子节点...当我在我的 simpleXML 对象上执行 print_r 时,<
仍显示为 <
在查看源代码中。但是,在我使用 DOMDocument 将该对象保存回 XML 后,<
转换为 <
和 >
转换为 >
关于如何改变这种行为的任何想法?我试过添加 dom->substituteEntities = false;
, 但这没有用。
//Convert SimpleXML element to DOM and save
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->substituteEntities = false;
$dom->loadXML($xml->asXML());
$dom->save($filename);
这里是我使用 <:
$new_hint = '<![CDATA[' . $value[0] . ']]>';
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint);
问题是我使用简单的 XML 循环访问 XML 文档中的某些节点,如果属性与给定的 ID 匹配,则使用 CDATA 添加特定的子节点。然后在所有处理之后,我使用 DOMDocument 将 XML 保存回文件,这是将 < 转换为 < 等的地方。
这是我整个类(class)文件的链接,因此您可以更好地了解我要完成的工作。具体引用最下面的hint_insert()方法。
最佳答案
SimpleXML和 php5 的 DOM module使用文档的相同内部表示(由 libxml 促进)。您可以在两个 api 之间切换,而无需通过 simplexml_import_dom() 和 dom_import_simplexml() 重新解析文档。 .
IE。如果你真的想要/必须在找到你的元素后使用 SimpleXML api 执行迭代,你可以切换到 DOM api 和 create the CData section在同一个文档中。
<?php
$doc = new SimpleXMLElement('<a>
<b id="id1">a</b>
<b id="id2">b</b>
<b id="id3">c</b>
</a>');
foreach( $doc->xpath('b[@id="id2"]') as $b ) {
$b = dom_import_simplexml($b);
$cdata = $b->ownerDocument->createCDataSection('0<>1');
$b->appendChild($cdata);
unset($b);
}
echo $doc->asxml();
打印
<?xml version="1.0"?>
<a>
<b id="id1">a</b>
<b id="id2">b<![CDATA[0<>1]]></b>
<b id="id3">c</b>
</a>
关于php - 如何防止 DOMDocument 将 < 保存为 <,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424084/