XMLin删除了CDATA

时间:2017-03-19 13:39:35

标签: xml perl

我正在使用XML :: Simple(XMLin)读取XML文件,在其某些属性中执行一些替换操作,然后将XMLOut放在另一个文件中。我注意到的是,XMLOut之前和之后的某些属性包含CDATA它们不再存在。

输入示例: <name><![CDATA[some text here]]></name>

输出:<name>some text here</name>

是否有保留CDATA attr的选项? (我知道CDATA代表什么以及为什么使用它)

2 个答案:

答案 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. 无论如何,我建议切换。它会让你的生活如此之多simpler

答案 1 :(得分:1)

看,我知道你在评论中说,你想通过使用XML::Simple来保持简单。但那是用词不当。 XML::Simple不是 - 它实际上非常复杂。 &#34;简单&#34; XML。

它的"discouraged"(甚至module info都说过)并且你有一个通读,你会明白为什么。

但是存在一些真正优秀的替代品。我建议您查看 XML::Twig - 学习曲线较低 - 或XML::LibXML更全面。如果你给我们一些示例XML,以及你到目前为止所尝试的内容 - 我们可以给你一个例子来做你想做的事情。它可能比你迄今为止所做的更简单