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,打开后:
在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文档,它不容易将其自身编码为一个
问题内容: 我想要以下输出: 将从您的充值帐户中扣除27.59欧元的50%。 当我做这样的事情时: 但这给了我这个错误,因为它也考虑使用in 进行替换。我该如何逃脱? 问题答案: 与另一个转义:
本文向大家介绍怎么防止HTML被转义?相关面试题,主要包含被问及怎么防止HTML被转义?时的应答技巧和注意事项,需要的朋友参考一下 <h1 dangerouslySetInnerHTML={{__html: 'cc © 2015'}}></h1>
问题内容: 当我的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;