Thread XML::LibXML - toString: Ersetzen von childNodes (1 answers)
Opened by AcidOverflow at 2006-01-26 14:42

AcidOverflow
 2006-01-26 14:42
#62322 #62322
User since
2006-01-26
1 Artikel
BenutzerIn
[Homepage] [default_avatar]
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 :)

Code: (dl )
use XML::LibXML 1.58; 


Input XML:
Code: (dl )
1
2
3
4
5
6
7
8
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:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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:
Code: (dl )
$myXmlObject->setvalue('//xID', '123');


Das enthält unser XML Ding jetzt:
Code: (dl )
1
2
3
4
5
6
7
8
9
@{$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-->

View full thread XML::LibXML - toString: Ersetzen von childNodes