使用XML :: LibXML编辑具有多个属性的XML文件

时间:2018-06-01 16:40:13

标签: perl

我试图根据节点属性名称值编辑现有的XML文件。

例如:

<books>
    <book name = 'Pride and Prejudice'   value='not available' price='10'/>
    <book name = 'To kill a Mockingbird'  value='available' price='8'/>
    <book name = 'The Face of a Stranger' value='not available' price='16'/>
</books>

目标是如果name属性值匹配,则更改value属性。例如,如果名称&#34; Pride and Prejudice&#34;匹配搜索,然后将值属性更改为“可用”。

输出应如下所示:

<books>
    <book name = 'Pride and Prejudice' value='available' price='10'/>
    <book name = 'To kill a Mockingbird' value='available' price='8'/>
    <book name = 'The Face of a Stranger' value='not available' price='16'/>
</books>

我能够读取XML文件并匹配名称值,但无法弄清楚如何更改属性值。

这是我的代码:

my $xml_data = XML::LibXML->load_xml(location => a.xml);

for my $nodes ( $xml_data->findnodes('/Books/Book') ) {

    my $att_name = $nodes->findvalue('@name');
    my $att_val  = $nodes->findvalue('@value');

    if ( $searchString eq $att_name ) {
         <how do I change the attribute value?>
    }
}

1 个答案:

答案 0 :(得分:2)

这应该按照你的意愿行事。请注意,我目前无法测试任何内容

您的XPath表达式/Books/Book可能需要修复,因为您显示的XML数据包含元素<books><book>,我无法知道哪个是正确的

for my $book ( $xml_data->findnodes('/Books/Book') ) {

    next unless $book->getAttribute('name') eq $searchString;

    $book->setAttribute('value', 'available');
}