X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FCWMP%2FParser.pm;h=7be91c395a23a65d3ade9794572e9cafb4b79be0;hb=154531e14a8fdafceb312dc3eec3eff1ed5676a9;hp=be09a5eb720c82d91fc0c2da742702ef42c0594b;hpb=df6a32df87becf896cccaae4b24cb88461391ffe;p=perl-cwmp.git diff --git a/lib/CWMP/Parser.pm b/lib/CWMP/Parser.pm index be09a5e..7be91c3 100644 --- a/lib/CWMP/Parser.pm +++ b/lib/CWMP/Parser.pm @@ -14,11 +14,13 @@ CWMP::Parser - parse SOAP request XML =head1 DESCRIPTION Design is based on my expirience with L, but show-stopper -was it's inability to parse invalid XML returned by some devices. +was it's inability to parse invalid XML returned by some devices, so +in this version we depend on L =cut our $state; # FIXME check this! +my $debug = 0; sub _get_array { my ( $tree ) = @_; @@ -82,40 +84,46 @@ sub _walk { $name =~ s/Struct//; $name =~ s/Value//; + my @struct; + if ( ref $tree->{$node} eq 'HASH' ) { - push @{ $state->{$name} }, _hash_value $tree->{$node}; + @struct = ( $tree->{$node} ); } elsif ( ref $tree->{$node} eq 'ARRAY' ) { + @struct = @{ $tree->{$node} }; + } else { + die "don't know how to handle $node in ",dump($tree); + } - foreach my $e ( @{ $tree->{$node} } ) { - my $hash = _hash_value $e; + foreach my $e ( @struct ) { + my $hash = _hash_value $e; - if ( my $n = delete $hash->{Name} ) { - my @keys = keys %$hash; - if ( $#keys > 0 ) { - $state->{$name}->{$n} = $hash; - } else { - $state->{$name}->{$n} = $hash->{ $keys[0] }; -# warn "using $keys[0] as value for $name.$n\n"; - } + if ( my $n = delete $hash->{Name} ) { + my @keys = keys %$hash; + if ( $#keys > 0 ) { + $state->{$name}->{$n} = $hash; } else { - push @{ $state->{$name} }, $hash; + $state->{$name}->{$n} = $hash->{ $keys[0] }; +# warn "using $keys[0] as value for $name.$n\n"; } + } else { + push @{ $state->{$name} }, $hash; } } + $dump = 1; } elsif ( ref($tree->{$node}) eq 'HASH' ) { $state->{_dispatch} = 'InformResponse' if $node =~ m/Inform/; - warn "## recurse $node\n"; + warn "## recurse $node\n" if $debug; _walk( $tree->{$node} ); } if ( $dump ) { # warn "XXX tree ",dump( $tree->{$node} ); - warn "## state ",dump( $state ); + warn "## state ",dump( $state ) if $debug; } } } @@ -126,6 +134,7 @@ sub parse { my $xml = shift || confess "no xml?"; $state = {}; + my $bare = XML::Bare->new( text => $xml ); my $hash = $bare->parse();