如何将空值变为空值而不是散列值?

时间:2013-12-18 21:05:59

标签: perl

我无法从XML文件中获取中间名的值。

这是我的XML文件:

<PERSON>
<ID>1</ID>
<FIRSTNAME>JOHN</FIRSTNAME>
<MIDDLENAME></MIDDLENAME>
<LASTNAME>SMITH</LASTNAME>
</PERSON>

这是我访问XML文件的方式:

// [...]
use XML::Simple;

my $file = shift;

open FILE,"$file" or die $!;
my @rawFile = <FILE>;
close (FILE);

my $xml = new XML::Simple;

my $data = $xml->XMLin("@rawFile");

my $place = "PERSON"
my $field = "MIDDLENAME"
my $value = $data->{$place}->{$self->{field}};

if (defined $value)
{
     print "Value is $value"
     print Dumper($data->{$place}); 
}

这是输出:

Value is [HASH(0x8ed6e28)]
$VAR1 = {
    'ID' => '1',
    'FIRSTNAME' => 'JOHN',
    'MIDDLENAME' => {},
    'LASTNAME' => 'SMITH',
    'PHONE' => '5551234'
}

如何访问我的中间名$ value,使其返回""(空字符串)而不是[HASH(0x8ed6e28)]

请注意,如果$field="FIRSTNAME",则"John"会返回$value的正确值。

2 个答案:

答案 0 :(得分:4)

XML :: Simple是最难使用的XML解析器。 ForceContent => 1可以做到这一点,虽然它会改变你的结构。

就个人而言,我使用的是XML :: LibXML。

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($qfn);

my %person;
for my $node ($doc->findnodes('/PERSON/*')) {
   $person{ $node->nodeName() } = $node->textContent();
}

答案 1 :(得分:2)

XML :: Simple是最容易使用的解析器之一。 ; D Adron提到SuppressEmpty控制着如何处理值。

#!/usr/bin/perl

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

my $raw_file;

while(<>)
{
    $raw_file .= $_;
}

print Dumper( XMLin( $raw_file, SuppressEmpty => '' ) ); 

exit;

此代码段产生以下输出:

$VAR1 = {
          'ID' => '1',
          'MIDDLENAME' => '',
          'LASTNAME' => 'SMITH',
          'FIRSTNAME' => 'JOHN'
        };