我正在使用XML :: Simple(XMLin)读取XML文件,在其某些属性中执行一些替换操作,然后将XMLOut放在另一个文件中。我注意到的是,XMLOut之前和之后的某些属性包含CDATA
它们不再存在。
输入示例:
<name><![CDATA[some text here]]></name>
输出:<name>some text here</name>
是否有保留CDATA attr的选项? (我知道CDATA代表什么以及为什么使用它)
答案 0 :(得分:2)
在解析过程中,文本是通过CDATA部分提供的。此外,XML :: Simple从不生成CDATA部分。
请注意,您提供的两个XML文档是100%等效的。但如果您绝对想要保留CDATA部分,我建议您切换到XML::LibXML [1] 。
$ perl -MXML::LibXML -e'
my $xml = "<name><![CDATA[some text here]]></name>";
XML::LibXML->new->parse_string($xml)->toFH(\*STDOUT);
'
<?xml version="1.0"?>
<name><![CDATA[some text here]]></name>
转换应该相对简单,因为XML :: Simple和XML :: LibXML都提供功能相似的接口。例如,
my $val = $node->{attr};
⇒my $val = $node->getAttribute('attr')
$node->{attr} = $val;
⇒$node->setAttribute('attr', $val)
for (@$node)
⇒for ($node->getChildren())
答案 1 :(得分:1)
看,我知道你在评论中说,你想通过使用XML::Simple
来保持简单。但那是用词不当。 XML::Simple
不是 - 它实际上非常复杂。 &#34;简单&#34; XML。
它的"discouraged"(甚至module info都说过)并且你有一个通读,你会明白为什么。
但是存在一些真正优秀的替代品。我建议您查看 XML::Twig
- 学习曲线较低 - 或XML::LibXML
更全面。如果你给我们一些示例XML,以及你到目前为止所尝试的内容 - 我们可以给你一个例子来做你想做的事情。它可能比你迄今为止所做的更简单 。