2015-10-17 77 views
1

使我的标题所暗示的:我有以下相关内容的Perl:保留空CDATA块空白在XML文件中

<element> 
    <id>ID</id> 
    <content> 
     <![CDATA[ 



     ]]> 
    </content> 
</element> 

我使用XML ::简单解析这个XML文件:

$localElement = XMLin($localElementXML, NoAttr=>1, SuppressEmpty=>'') 

导致这个Perl中的哈希:

{ 
    'content' => '', 
    'id' => 'ID' 
}; 

如果我插入空格比任何其他在中间的那个空CDATA块,所有的空白被保留:

{ 
    'content' => ' 


    -- 


', 
    'id' => 'ID' 
}; 

我需要做到的,是为要保留空白(在基本上长,空字符串),即使有在它的中间没有其他字符。是的,我正在使用“SuppressEmpty”,但我认为元素不是空的,它是一个充满空间,换行符等的CDATA块。我错过了什么吗?我怎样才能使这个工作?我还没有发现任何明显的XML :: Simple选项来改变这种行为。

非常感谢。

+3

简单地说,[XML ::简单](http://metacpan.org/module/XML::Simple)是可怕的。不要使用它。它自己的文档说*不鼓励在新代码中使用这个模块。其他模块可提供更直接和一致的接口。* – Borodin

回答

3

这里是你的问题:

我使用XML::Simple解析这个:

不要。 XML::Simple甚至说'不要使用这个模块'。

使用本模块中新代码是不鼓励。其他模块可提供更直接和一致的接口。

原因很简单 - 只能通过数组和哈希来直接表示非常简单(或者确实简单)的XML片段。

如何XML::Twig

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $twig = XML::Twig->new('pretty_print' => 'indented_a')->parse(\*DATA); 

$twig->print; 

my $content = $twig->root->first_child('content')->text; 
print "Content is :\"", $content, "\"\n"; 

__DATA__ 
<element> 
    <id>ID</id> 
    <content> 
     <![CDATA[ 



     ]]> 
    </content> 
</element> 

它打印:

<element> 
    <id>ID</id> 
    <content><![CDATA[ 



     ]]></content> 
</element> 
Content is :" 



     " 

当然,从那里,接下来的问题是 - 你要什么给做的内容。