Schrift
[thread]7653[/thread]

XML::LibXML - toString: Ersetzen von childNodes



<< >> 2 Einträge, 1 Seite
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-->
esskar
 2006-01-26 21:34
#62323 #62323
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du machst wohl was falsch

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use warnings;

use XML::LibXML;

my $xc = XML::LibXML->new;
my $node = $xc->parse_string('<?xml version="1.0" encoding="UTF-8"?><xData><xID>28344</xID><mType>s</mType></xData>');

print $node->toString;

my $path = '//xID';
my $value = '123';
if (my $subnode = $node->findnodes($path)->[0]) {
$subnode->removeChildNodes();
$subnode->appendTextNode( $value );
}

print $node->toString;
<< >> 2 Einträge, 1 Seite



View all threads created 2006-01-26 14:42.