具有以下内容:
perl -MXML::LibXML::Simple -MData::Dumper -E '$h=XMLin("<some><bubu>string</bubu></some>");say Dumper $h'
解析为:
$VAR1 = {
'bubu' => 'string'
};
但是
perl -MXML::LibXML::Simple -MData::Dumper -E '$h=XMLin("<some><bubu/></some>"); say Dumper $h'
或者
perl -MXML::LibXML::Simple -MData::Dumper -E '$h=XMLin("<some><bubu></bubu></some>");say Dumper $h'
印刷:
$VAR1 = {
'bubu' => {}
};
有可能得到
$VAR1 = {
'bubu' => ""
};
要与其他字符串值一致吗?
问题背后的实际代码如下:
package Something {
use Moose;
has 'bar' => (is => 'ro', isa => 'Str');
has 'baz' => (is => 'ro', isa => 'Str');
}
use 5.014;
use warnings;
use XML::LibXML::Simple;
my $xml = do {local $/, <DATA>};
my $hr = XMLin($xml);
for my $node( @{$hr->{node}} ) {
my $obj = Something->new($node);
}
__DATA__
<root>
<node>
<bar>bar1</bar>
<baz>baz1</baz>
</node>
<node>
<bar>bar2</bar>
<baz/>
</node>
</root>
死于
Attribute (baz) does not pass the type constraint because: Validation failed for 'Str' with value HASH(0x7f91a4a92450) at /opt/anyenv/envs/plenv/versions/5.24.0/lib/perl5/site_perl/5.24.0/darwin-2level/Moose/Object.pm line 24
Moose::Object::new('Something', 'HASH(0x7f91a3f3d430)') called at l line 28
因此我需要
baz
不是{}
,但作为''
Something
任何空hash引用强制{}
为空字符串''
。对简单方法有任何想法吗?
因此,结果。接受的答案仍然存在,因为它为上述问题提供了答案。
但是必须要说的是,在研究了新的(非常复杂的)模块XML :: Twig + learningXPath
的基础知识3天之后,我得到了一个解决方案,它比该XMLIn
解决方案更清晰,更好。
在XMLIn
i中,我需要重新组织得到的hashref,因为只需要几个元素并具有精确定义的结构即可。(对于构造函数可接受)。这样的重组(删除不需要的成员,将更深的hashref的值移动到arrayrefs等)在perl中很容易,但是代码不是很好,并且需要解决上述问题。
使用XML :: Twig(和此处的2个后续问题),结果比XMLIn更加整洁,可读性强,时间短。确实最好牺牲一些时间并学习(至少是基础知识)XPath
...
XML :: LibXML :: Simple似乎没有启用此行为的选项。
XML :: Simple可以,但是;设置SuppressEmpty
为空字符串以将空节点解析为字符串而不是容器:
# perl -MXML::Simple -MData::Dumper \
-E '$h=XMLin("<some><bubu></bubu></some>", SuppressEmpty => ""); say Dumper $h'
$VAR1 = {
'bubu' => ''
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句