php - 如何防止 DOMDocument 将 < 保存为 &lt

标签 php xml simplexml domdocument

我正在使用 simpleXML 在我的一个 XML 文档中添加一个子节点...当我在我的 simpleXML 对象上执行 print_r 时,<仍显示为 <在查看源代码中。但是,在我使用 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);

这里是我使用 <:

$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()方法。

http://pastie.org/1079562

最佳答案

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 将 < 保存为 &lt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424084/

相关文章:

c# - 如何增加uwp中toastNotification的显示时间?

php - simplexml 错误处理 php

PHP/MySQL 多对多关系——下一步在这里

php - Symfony2 - Twig 渲染 Controller 和返回数组响应

php - php 是否存在 `pry` 等价物?

php - $request->route() 在 laravel 中返​​回 null

java - 如何在 JAXB 中解码 xml 时处理特殊字符

c++ - RapidXML: "expected <"文件末尾错误与空白错误相关?

php - 使用/PHP 从 XML 响应中提取数据

php simplexml_load_file - 无法在 print_r 中看到