当前位置: 首页 > 知识库问答 >
问题:

php - PHP生成XML文件,<>被转义,怎么才能让它不转义呢?

陈斌蔚
2024-06-12

PHP生成XML文件,<>被转义,怎么才能让它不转义呢?

$xmlstring = '<?xml version="1.0" encoding="utf-8"?><DOCUMENT></DOCUMENT>';$xml = simplexml_load_string($xmlstring);foreach($data as $v){        $array = array(            'item'=>array(                'key'=>'<![CDATA['.$key.']]>',                'display'=>array(                    'question'=> '<![CDATA['.$title.']]>',                    'tag1'=>'<![CDATA['.$tag1.']]>',                    'tag2'=>'<![CDATA['.$tag2.']]>',                    'id'=>'<![CDATA[2]]>',                    'title'=>'<![CDATA['.$title.']]>',                    'url'=>'<![CDATA['.$wapUrl.']]>',                    'source'=>'<![CDATA['.$webname.']]>',                    'source_logo'=>'<![CDATA['.$wapUrl.'favicon.jpg]]>',                    'source_slogan'=>'<![CDATA['.$source_slogan.']]>',                    'answerinfo'=>array(                        'article'=>array(                            'article_url'=>'<![CDATA['.$wapUrl.']]>'                        )                    ),                )            )        );        $this->array_to_xml($array, $xml);}$r = $xml->asXML($xmlpath);// 递归地将数组转换为XMLfunction array_to_xml($array, &$xml) {    foreach($array as $key => $value) {        if(is_array($value)) {            if(!is_numeric($key)){                $subnode = $xml->addChild("$key");                $this->array_to_xml($value, $subnode);            } else {                $this->array_to_xml($value, $xml);            }        } else {            $xml->addChild("$key",$value);            //$xml->addChild("$key",htmlspecialchars($value, ENT_XML1));        }    }}

得到的XML,打开后:
image.png

共有1个答案

卞俊贤
2024-06-12

在PHP中,当你创建XML内容时,通常你不需要手动添加<![CDATA[]]>标记来避免特殊字符(如<>)被转义。相反,你应该让XML处理库(如SimpleXML)自动处理这些转义。<![CDATA[]]>是XML中用于包含可能被解析器解析的文本的特殊结构,它告诉解析器将其中的内容作为纯文本处理,而不是作为XML标记。

在你的代码中,你试图通过添加<![CDATA[]]>来避免转义,但这实际上是不必要的,并且可能导致XML格式错误。相反,你应该确保在将值添加到XML节点时,不包含任何XML特殊字符,或者使用函数(如htmlspecialchars)来正确地转义这些字符。

但是,如果你确实需要包含可能被解析为XML的文本,并且想要避免转义,你可以使用CData方法来创建包含CDATA部分的节点。例如:

$node->addChild('key', dom_import_simplexml($xml)->ownerDocument->createCDATASection($key));

然而,在你的代码中,你似乎想要添加CDATA部分到数组的多个层级中,这可能会使代码变得复杂。简单的方法是直接创建包含CDATA的节点,而不是尝试在数组结构中手动添加<![CDATA[]]>

以下是一个简化的例子,展示了如何在添加节点时使用CDATA:

function array_to_xml($array, &$xml_object) {    foreach ($array as $key => $value) {        if (is_array($value)) {            if (!is_numeric($key)) {                $subnode = $xml_object->addChild($key);                array_to_xml($value, $subnode);            } else {                // 如果键是数字,可能需要特殊处理,取决于你的数据结构                // 这里假设我们想要添加到一个特定的子节点中,比如'item'                $item = $xml_object->addChild('item');                array_to_xml(array($key => $value), $item); // 包装数组以使用$key作为新的子节点名            }        } else {            // 使用CData添加节点值            $xml_object->addChild($key, dom_import_simplexml($xml_object)->ownerDocument->createCDATASection($value));        }    }}// 使用你的代码的其他部分来创建和填充$xml对象...// 调用函数来转换数组到XMLarray_to_xml($array, $xml);// 输出或保存XML$r = $xml->asXML($xmlpath);

注意:这里的关键是使用dom_import_simplexml来将SimpleXML对象转换为DOM对象,然后利用DOM的createCDATASection方法来创建CDATA部分。之后,你可以将这个CDATA部分添加到SimpleXML节点中。

此外,请确保你的$data数组和其他相关变量在使用之前已经正确初始化和填充了数据。在你的原始代码中,这些变量没有被显示或定义,所以我假设它们已经以某种方式存在和设置了。

 类似资料:
  • 问题内容: 我正在从PHP脚本生成XML文档,并且需要转义XML特殊字符。我知道应该转义的字符列表;但是正确的方法是什么? 应该使用反斜杠(')来转义字符还是正确的方法?有内置的PHP函数可以为我处理此问题吗? 问题答案: 使用DOM类生成整个XML文档。它将处理我们甚至不需要关心的编码和解码。 编辑: 这被@Tchalvak批评: DOM对象创建了一个完整的XML文档,它不容易将其自身编码为一个

  • 本文向大家介绍怎么防止HTML被转义?相关面试题,主要包含被问及怎么防止HTML被转义?时的应答技巧和注意事项,需要的朋友参考一下 <h1 dangerouslySetInnerHTML={{__html: 'cc © 2015'}}></h1>

  • 问题内容: 我想要以下输出: 将从您的充值帐户中扣除27.59欧元的50%。 当我做这样的事情时: 但这给了我这个错误,因为它也考虑使用in 进行替换。我该如何逃脱? 问题答案: 与另一个转义:

  • 问题内容: 当我的PHP脚本从AJAX POST请求接收数据时,将对变量进行转义。真正奇怪的是,这仅发生在我的生产服务器(在Linux上运行PHP 5.2.12)上,而不在我的本地服务器(在Windows上运行PHP 5.3.1)上发生。 这是AJAX代码: 这有什么原因吗?我应该如何解决这个问题,使其在两台服务器上都能正常工作? 编辑:我对magic_quotes具有以下设置: 问题答案: 您可

  • 问题内容: 这是我所拥有的信息: 我正在使用MySQL和PHP5在基于Linux的系统上工作。我需要能够从.php文件中生成一个,然后将该转储存储在服务器上我指定的位置的文件中。 因为我是PHP nooblet,所以我希望有人给我一些帮助,指导或代码,这些可以帮助我完成所需的工作。这将必须从Internet远程运行。 问题答案: 您可以使用该 功能执行外部命令。 注意:在和之间,我会选择第二个,它

  • 本文向大家介绍怎么才能让图文不可复制?相关面试题,主要包含被问及怎么才能让图文不可复制?时的应答技巧和注意事项,需要的朋友参考一下 -webkit-user-select: none; -ms-user-select: none; -moz-user-select: none; -khtml-user-select: none; user-select: none;

  • {{ /n }} 文本插值在页面上不起作用 怎么让它在页面上换行? (除了用textarea以外)

  • 谁能告诉我从.p12文件中提取/转换证书.crt文件的正确方法/命令吗?在我搜查之后。我找到了将.pem转换为.crt的方法。但未找到.p12到.crt。