7 use Data::Dump qw/dump/;
8 use Carp qw/confess cluck/;
12 CWMP::Parser - parse SOAP request XML
16 Design is based on my expirience with L<XML::Rules>, but show-stopper
17 was it's inability to parse invalid XML returned by some devices.
21 our $state; # FIXME check this!
28 foreach my $n ( keys %$tree ) {
29 next unless ref($tree->{$n}) eq 'ARRAY';
30 @out = map { $_->{value} } @{ $tree->{$n} };
34 die "no array in ",dump($tree) unless @out;
42 foreach my $n ( keys %$tree ) {
43 next unless ref($tree->{$n}) eq 'HASH';
44 $hash->{$n} = $tree->{$n}->{value};
46 die "no hash value in ",dump($hash) unless $hash;
53 foreach my $node ( keys %$tree ) {
54 next if $node =~ m/^_/;
58 if ( $node =~ m/GetRPCMethodsResponse/ ) {
60 $state->{MethodList} = [ _get_array( $tree->{$node}->{MethodList} ) ];
63 } elsif ( $node =~ m/(ID|MaxEnvelopes|CurrentTime|RetryCount)/ ) {
65 $state->{$1} = $tree->{$node}->{value};
69 } elsif ( $node =~ m/(DeviceId)/ ) {
71 $state->{$1} = _hash_value $tree->{$node};
74 } elsif ( $node =~ m/(Fault)/ && ! defined $tree->{$node}->{detail} ) {
76 $state->{$1} = _hash_value $tree->{$node};
79 } elsif ( $node =~ m/(EventStruct|ParameterValueStruct|ParameterInfoStruct)/ ) {
85 if ( ref $tree->{$node} eq 'HASH' ) {
86 push @{ $state->{$name} }, _hash_value $tree->{$node};
87 } elsif ( ref $tree->{$node} eq 'ARRAY' ) {
89 foreach my $e ( @{ $tree->{$node} } ) {
90 my $hash = _hash_value $e;
92 if ( my $n = delete $hash->{Name} ) {
93 my @keys = keys %$hash;
95 $state->{$name}->{$n} = $hash;
97 $state->{$name}->{$n} = $hash->{ $keys[0] };
98 # warn "using $keys[0] as value for $name.$n\n";
101 push @{ $state->{$name} }, $hash;
107 } elsif ( ref($tree->{$node}) eq 'HASH' ) {
109 $state->{_dispatch} = 'InformResponse' if $node =~ m/Inform/;
111 warn "## recurse $node\n";
112 _walk( $tree->{$node} );
117 # warn "XXX tree ",dump( $tree->{$node} );
118 warn "## state ",dump( $state );
126 my $xml = shift || confess "no xml?";
129 my $bare = XML::Bare->new( text => $xml );
130 my $hash = $bare->parse();
133 #warn "# parsed to ",dump($hash);