2015-10-17 3 views
1

так как мое название говорит: у меня есть файл XML со следующим соответствующим содержаниемPerl: сохранение пробелов в пустом блоке CDATA в XML-файле

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



     ]]> 
    </content> 
</element> 

Я использую XML :: Simple для разбора этого:

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

что приводит к этой PERL хэш:

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

Если вставить что-нибудь, кроме пробела в середине, что Пустой блок CDATA, сохраняется все пробельные:

{ 
    'content' => ' 


    -- 


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

Что мне нужно достичь для пробельные быть сохранены (в основном длинной, пустая строка), даже если нет никаких других символов в середине его , Да, я использую «SuppressEmpty», но я думаю, что элемент не пуст, это CDATA-блок, полный пробелов, разрывов строк и т. Д. Я что-то пропустил? Как я могу заставить это работать? Я не нашел никаких очевидных опций для XML :: Simple, чтобы изменить это поведение.

Большое спасибо.

+3

Проще говоря, [XML :: Simple] (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 :" 



     " 

Конечно, оттуда, следующий вопрос - что вы хотите сделать с этим содержанием.

Смежные вопросы