Perl XML::LibXML update contect -
this question has reply here:
xml::libxml replace element value 2 answersi 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