Thread XML::DOM / XML::Semanticdiff: why oh why don't they DWIM (12 answers)
Opened by dukeofnukem at 2007-03-20 13:58

dukeofnukem
 2007-03-20 13:58
#75154 #75154
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Alohá!

Bin grade dabei einen XML-Differ zu bauen der ein wenig konfigurierbare Logik enthalten soll um deltas zwischen Referenzen und Ergebnissen ausblenden zu können wenn diese erwartet und ok sind.

Aber ins Detail:

Problem 1:
Wenn ich zwei XMLs durch XML::SemanticDiff jage, erhalte ich ein array von hashrefs auf die deltas; ein hash sieht etwa so aus (Data::Dumper):
Code: (dl )
1
2
3
4
5
6
$VAR1 = {
'new_value' =>,
'context' => ,
'old_value' => ,
'message' =>
};


Hier ist lediglich interessant: In 'context' steht der Pfad in XPath-Notation.

Wenn ich jetzt versuche an den Wert der Node zu gelangen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
sub analyze_delta {
my ($self, %args) = @_;

use XML::DOM;
use XML::DOM::XPath;

$self->{'majorDOMus'} = XML::DOM::Parser->new()
unless $self->{'majorDOMus'};

my $id = $args{'id'};

my ($tree1, $tree2) = map { $self->{'majorDOMus'}->parse($_); } ${ $self->{'failures'}->{$id}->{'doc1'} }, ${ $self->{'failures'}->{$id}->{'doc2'} };

for my $delta ( @{ $self->{'failures'}->{$id}->{'deltas'} } ) {
my $path = $delta->{'context'};
my @nodes;
( @nodes = $tree1->findnodes($path) ) ?
1 :
( @nodes = $tree2->findnodes($path) ) ?

1 :

print "\nThere is no node at '$path'\n";

print "\n", $_->getData for @nodes;

print "\n", $_->toString, "\n" for @nodes;

}
}

habe ich folgende Ausgabe bzgl. des 'getData':
Code: (dl )
Can't locate object method "getData" via package "XML::DOM::Element" at ../XmlDiffer.pm line 126.


Das war Problem 1...

Problem 2: ist die Tatsache, daß XML::SemanticDiff buggy zu sein scheint; es liefert mir teilweise einen Pfad der mit .../element[2] endet obwohl es dort nur ein Element gibt; entsprechend findet meine sub kein solches Element im Tree.

Problem 3: liegt wiederum bei XML::SemanticDiff. Beim diffen einiger XMLs wirft er mir warnings bzgl.
Code: (dl )
Use of uninitialized value in string eq at /users/user4/usr/lib/perl5/site_perl/XML/SemanticDiff.pm

die auf die SemanticDiff-internen Vergleiche verweisen:
Code: (dl )
$from_doc->{$element}->{NamespaceURI} eq $to_doc->{$element}->{NamespaceURI}
sowie
Code: (dl )
$from_doc->{$element}->{TextChecksum} eq $to_doc->{$element}->{TextChecksum}


Bzlg. Problem 2 und 3 werde ich mich wohl mal an den Author wenden; aber was mache ich bloß falsch bzlg. Problem 1?
Die Doku bzgl. XML::DOM (bzw. die spec vom DOM Class Interface) lassen mich eigentlich nur auf 'getData' schließen...

TIA,

Martin\n\n

<!--EDIT|dukeofnukem|1174392042-->
drum&bass is a state of mind

View full thread XML::DOM / XML::Semanticdiff: why oh why don't they DWIM