Saturday, 15 May 2010

Perl XML::LibXML update contect -



Perl XML::LibXML update contect -

this question has reply here:

xml::libxml replace element value 2 answers

i trying update content of xml element. using xml::libxml , need utilize library. here sample data.

<data-table> <data> <number>1</number> <letter>one</letter> </data> <data> <number>2</number> <letter>two</letter> </data> </data-table>

what alter contents of letter "purple" if number 2. believe i'm having problem designating xpath work. next error

"can't locate object method "setdata" via bundle "xml::libxml::nodelist" at"

i've been struggling days help appreciated.

utilize xml::libxml; $p = xml::libxml->new; $d = $p->parse_fh(\*data); $node ($d->findnodes('//data-table/data')) { $childnode ($node->findnodes('./number/text()')) { if($childnode->textcontent() == '1') { # here problem is! $changenumernode = $node->findnodes('./letter/text()'); $changenumernode->setdata("purple"); } } } print $d->tostring; __data__ <data-table> <data> <number>1</number> <letter>one</letter> </data> <data> <number>2</number> <letter>two</letter> </data> </data-table>

findnodes doesn't homecoming node. returns list of nodes or ::nodelist. forcefulness homecoming list , take first node returned.

for $node ($d->findnodes('//data-table/data')) { ($number_node) = $node->findnodes('number') or next; $number_node->textcontent() eq '1' or next; ($letter_text) = $node->findnodes('letter/text()') or next; $letter_text->setdata('purple'); }

(as can see, removed pure noise usage of ./.)

you use

for $letter_text ($d->findnodes( '//data-table/data[number/text()="1"]/letter/text()')) { $letter_text->setdata('purple'); }

xml perl xml-libxml

No comments:

Post a Comment