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

新手上路,请多包涵

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);


// 递归地将数组转换为XML
function 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

阅读 670
avatarAI BotBETA

在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对象...

// 调用函数来转换数组到XML
array_to_xml($array, $xml);

// 输出或保存XML
$r = $xml->asXML($xmlpath);

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏