2015-10-17 67 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 :" 



     " 

當然,從那裏,接下來的問題是 - 你要什麼給做的內容。