Hi zusammen,
Ich habe zwischen meinen eigentlichen Programmen und LibXML eine Zwischenschicht, damit sich der Parser leicht austauschen kann.
Mit der Methode setvalue will ich alle Childs eines Knotens (also auch TextNode-Childs) löschen. Danach füge ich einen neuen TextNode an.
Problem:
Leider liefert mir nun LibXML bei toString nur das richtige Ergebnis wenn ich den entsprechenden Knoten suche (findnodes) und dann mit toString ausgebe.
Wenn ich mir das komplette XML ausgebe bekomme ich weiterhin die alten Werte.
Danke schonmal :)
Input XML:
my $xc = XML::LibXML->new;
$self->{_element} = $xc->parse_string(<<"data"
<?xml version="1.0" encoding="UTF-8"?>
<xData>
<xID>28344</xID>
<mType>s</mType>
</xData>
data
Die defekte Methode:
sub setvalue {
my $self = shift;
my $path = shift;
my $value = shift;
my ($node, $myChild);
if ( $node = @{$self->{_element}->findnodes($path)}[0] ) {
$node->removeChildNodes();
$node->appendTextNode( $value );
}
return $self;
}
Aufruf der Methode:
$myXmlObject->setvalue('//xID', '123');
Das enthält unser XML Ding jetzt:
@{$self->{_element}->findnodes($path)}[0]->toString eq '<xID>123</xID>';
$self->{_element}->toString eq
'<?xml version="1.0" encoding="UTF-8"?>
<xData>
<xID>28344</xID>
<mType>s</mType>
</xData>
';
\n\n
<!--EDIT|AcidOverflow|1138279466-->