如何防止DOMDocument保存<as&lt

Thi*_*its 8 php xml simplexml domdocument

我正在使用simpleXML在我的一个XML文档中添加子节点...当我在simpleXML对象上执行print_r时,<仍然<在视图源中显示为a .但是,在使用DOMDocument将此对象保存回XML后,将<转换为&lt;>转换为&gt;

关于如何改变这种行为的任何想法?我试过添加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);
Run Code Online (Sandbox Code Playgroud)

这是我正在使用<:

$new_hint = '<![CDATA[' . $value[0] . ']]>';               
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint);
Run Code Online (Sandbox Code Playgroud)

问题是,我使用简单的XML来迭代XML文档中的某些节点,如果属性与给定的ID匹配,则会添加一个特定的子节点和CDATA.然后在所有处理之后,我使用DOMDocument将XML保存回文件,这是<转换为<等的地方.

这是我的整个类文件的链接,因此您可以更好地了解我正在尝试完成的任务.具体请参考底部的hint_insert()方法.

http://pastie.org/1079562

Vol*_*erK 10

SimpleXML和php5的DOM模块使用相同的文档内部表示(由libxml提供).您可以在两个apis之间切换,而无需通过simplexml_import_dom()和dom_import_simplexml()重新解析文档.
即如果你真的想要/必须使用SimpleXML api执行迭代,一旦找到了你的元素,你就可以切换到DOM api并在同一文档中创建CData部分.

<?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();
Run Code Online (Sandbox Code Playgroud)

版画

<?xml version="1.0"?>
<a>
  <b id="id1">a</b>
  <b id="id2">b<![CDATA[0<>1]]></b>
  <b id="id3">c</b>
</a>
Run Code Online (Sandbox Code Playgroud)