【问题标题】:Edit XML with CDATA using SimpleXMLElement使用 SimpleXMLElement 使用 CDATA 编辑 XML
【发布时间】:2023-03-05 12:10:01
【问题描述】:

我已经看到很多关于如何使用 CDATA 加载 XML 字符串或如何使用 CDATA 内容编写元素的问题,但我无法找到一种方法来编辑 XML已经包含 CDATA 并在使用 $xml->asXML() 后保留那些以前的 CDATA。

有没有办法编辑一个已经包含 CDATA 的 XML 并在使用 $xml->asXML() 后保留那些以前的 CDATA ?

看看这个场景:

<?php
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>";

try {
    echo "XML with CDATA: \n\n";
    $xml = simplexml_load_string($str_xml, null, LIBXML_NOCDATA);
    echo $xml->asXML() ."\n\n";
} catch(Exception $e){
    echo "XML with CDATA: \n\n";
    echo $e->getMessage() ."\n\n";
}
?>

运行此示例后,输出为:

<?xml version="1.0"?>
<myxml><mytag>In this content, 8 &gt; 2 &amp; 1 &lt; 9, and 10 is a 10% of 100. </mytag></myxml>

如您所见,此输出 XML 字符串不再具有 CDATA 标记值。使用此输出加载另一个 simplexml_load_string 不会失败,但现有的 CDATA 标记已消失,特殊字符也将替换为其对应的 html 实体。

我需要知道是否有办法读取任何包含任何个 CDATA 节点值的 XML,并且在使用 $xml-&gt;asXML() 之后,输出字符串仍然包含以前的 CDATA 标记值。

感谢您的帮助。

【问题讨论】:

    标签: php simplexml cdata


    【解决方案1】:

    写出的 XML 不包含 CDATA 节点,因为您在传递 LIBXML_NOCDATA 时告诉 SimpleXML 删除它们。要保留它们,请不要通过该选项!

    Here's a live demo of the fixed version,如下:

    <?php
    $str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>";
    
    try {
        echo "XML with CDATA: \n\n";
        $xml = simplexml_load_string($str_xml);
        echo $xml->asXML() ."\n\n";
    } catch(Exception $e){
        echo "XML with CDATA: \n\n";
        echo $e->getMessage() ."\n\n";
    }
    

    您读过的所有答案和 cmets 都告诉您需要传递该选项才能将 CDATA 节点与 SimpleXML 一起使用,这完全是错误。唯一的问题是print_rvar_dump 等的输出没有给出SimpleXML 可访问数据的完整表示; 这并不意味着它不存在

    要获取示例 XML 中的文本,您只需要将元素转换为字符串(某些上下文,例如 echo 语句,会自动执行此操作)。如this example

    $xml = simplexml_load_string($str_xml);
    $tag_content = (string)$xml->mytag;
    echo "Here is the content of the <mytag> node: $tag_content";
    

    【讨论】:

    • 太棒了!。我从来没有尝试过这样处理它,因为我一直认为处理 CDATA 标签需要特殊选项等。当然,添加 CDATA 标签需要 DOMDocument::createCDATASection 的帮助(命名一种方式)。谢谢!!
    猜你喜欢
    • 2011-09-09
    • 2013-07-05
    • 1970-01-01
    • 2011-02-27
    • 2014-10-27
    • 2011-03-09
    相关资源
    最近更新 更多