2016-04-25 3 views
-1

Я борюсь с XML :: Просто в Perl и элементах с возможностью NULL.Perl XML :: Simple: SuppressEmpty для xsi: nil-Elements без содержимого?

Так что это мой пример-XML:

<MyXml> 
    <SomeNumber>123</SomeNumber> 
    <EmptyOne/> 
    <NullableElement xsi:nil="true"></NullableElement> 
</MyXml> 

Если я прочитал это с XMLin и SuppressEmpty => 1 Я получаю пустую строку для EmptyOne, но Hash с xsi: nil = "true" для NullableElement. Мои вопросы: как я могу сказать XMLin игнорировать xsi: nil-Content и просто дать мне пустую строку или undef? Возможно ли это с помощью XML :: Simple или я должен переключиться на Lib :: XML?

Здесь какой-то код, чтобы увидеть результат:

use XML::Simple; 
use Data::Dumper; 

my $xmlIn = '<MyXml><SomeNumber>123</SomeNumber><EmptyOne/><NullableElement xsi:nil="true"></NullableElement></MyXml>'; 
my $xmlHash = XMLin($xmlIn, SuppressEmpty => ''); 

print Dumper($xmlHash); 
+0

Существует причина, по которой 'XML :: Simple' [обескуражен] (http://stackoverflow.com/questions/33267765/why-is-xmlsimple-discouraged). Придерживайтесь 'XML :: Twig'' XML :: LibXML'. – Sobrique

ответ

0

Ну я нашел решение моей проблемы сам, но это работает только для моего конкретного случая, потому что у меня нет никаких атрибутов мне нужно. Если да, то вы можете изменить линию

my $xmlHash = XMLin($xmlIn, SuppressEmpty => ''); 

в

my $xmlHash = XMLin($xmlIn, NoAttr => 1, SuppressEmpty => ''); 

Это отрежет все атрибуты и возвращает пустую строку как обычный пустой элемент.

Как уже упоминалось ранее, это будет работать только в том случае, если вам не нужны никакие атрибуты из xml. Если они вам понадобятся, это не сработает.

+1

Вы видели массивную антипатию к «XML :: Simple»? Я удивлен, что вы не были залиты ответами, которые говорят вам посмотреть [документацию модуля] (https://metacpan.org/pod/XML::Simple), в котором говорится: «Вы действительно не хотите используйте этот модуль в новом коде "*. Попробуйте [XML :: Twig] (https://metacpan.org/pod/XML::Twig) или [XML :: LibXML] (https://metacpan.org/pod/XML::LibXML) и спасите себя некоторые слезы – Borodin

+0

В моих типичных проектах я сам использую XML :: LibXML. В этом случае я только что принял проект от коллеги;) Мне было интересно, есть ли какие-либо другие решения для достижения этого, и, как я уже упоминал в своих вопросах, я не вынужден использовать XML :: Simple. – Streuner

0

В XML::Twig:

use XML::Twig; 
my $xmlIn = 
    '<MyXml><SomeNumber>123</SomeNumber><EmptyOne/><NullableElement xsi:nil="true"></NullableElement></MyXml>'; 

print XML::Twig->parse($xmlIn)->get_xpath('//NullableElement', 0)->text, "\n"; 

XML::Simple: Why is XML::Simple "Discouraged"?

Это просто не стоит использовать, так как это путь к хрупкой коде.