Perl XML::Simple:xsi:nil 没有内容的元素的 SuppressEmpty?

Perl XML::Simple: SuppressEmpty for xsi:nil-Elements without content?

我在 Perl 和可为 null 的元素中苦苦挣扎 XML::Simple。

所以这是我的例子-XML:

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

如果我用 XMLinSuppressEmpty => 1 阅读这篇文章,我会得到一个空字符串EmptyOne,但是 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);

好吧,我自己找到了解决问题的方法,但这只适用于我的特定情况,因为我没有任何我需要的属性。如果是这样,您可以更改行

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

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

这将切断所有属性和return一个空字符串,就像一个普通的空元素。

如前所述,这仅在您不需要 xml 中的任何属性时才有效。如果您确实需要它们,这将不起作用。

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:

它只是不值得使用,因为它是通往脆弱代码的道路。