使用Perl脚本仅在XML的节点值中更改几个字符 [英] Change few characters only in a node value in XML using Perl script

查看:130
本文介绍了使用Perl脚本仅在XML的节点值中更改几个字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

原始XML:

<library>
<email name="Peter P">Peter_Parker@library.com</email>
</library>

预期结果:

<library>
<email name="Peter Parker">Peter.Parker@library.com</email>
<address>London</address>
</library>

进一步的XML挑战:

<library>
<email name="Peter Parker">Peter.Parker@library.com</email>
<address> 
    <housenumber>1</housenumber>
    <street>Regent Street</street>
    <postcode>AB12YZ</postcode>
</address>
</library>

代码:

use strict;
use XML::LibXML;
use XML::LibXML::NodeList;

my $parser = XML::LibXML->new;
my $doc = $parser->parse_file("StackTest.xml");
my $root = $doc->getDocumentElement();

#to modify email address
my $email = $doc->findnodes("/library/email");
my $text = XML::LibXML::Text->new('Peter.Parker@library.com');
$email->replaceNode($text);

#to modify email name attribute
my $email_attribute = $doc->findnodes("/library/email");
my $email_name_att->setAttribute(q|name|,"Peter Parker");
$email_attribute->getAttribute(q|name|);

#to add <address tag> with value
my $address = $doc->createElement('address');
$address->appendText('London');
$root->appendChild($address);

print($doc->toString);

错误消息:

无法通过包"XML :: LibXML :: NodeList"找到对象方法"replaceNode"

Can't locate object method "replaceNode" via package "XML::LibXML::NodeList"

我是初学者,是Perl脚本的新手.我想使用Perl和XML :: LibXML模块修改XML文件.我也访问了CPAN,但是很难通过很少的相关示例来理解这个概念.如果您能为我提供一些提示,那对提高我的知识很有帮助.

I'm a beginner and new to Perl script. I'd like to modify the XML file using Perl and XML::LibXML module. I also visited CPAN but it's very difficult to grasp the concept with very little related examples. If you could provide me some hints that would be great to improve my knowledge.

很高兴获得各种反馈,并愿意学习:)

Happy to get any sort of feedback and willing to learn :)

推荐答案

来自

findnodes计算当前节点上的xpath表达式(XPath 1.0),并将结果节点集作为数组返回.在标量上下文中,返回XML :: LibXML :: NodeList对象.

findnodes evaluates the xpath expression (XPath 1.0) on the current node and returns the resulting node set as an array. In scalar context, returns an XML::LibXML::NodeList object.

由于$variable = $doc->findnodes(...),您的调用处于标量上下文中. 您有三种选择:

Your calls are in scalar context because of the $variable = $doc->findnodes(...). You have three options:

  1. 使用my $el = $doc->find(...)返回单个节点.
  2. 或者,使用语法my ($el) = $doc->findnodes(...).这会导致在 list上下文中进行调用,并将返回列表的第一个元素分配给$el.
  3. 如果XPath表达式可以包含更多节点,则可以使用for表达式来遍历->findnodes(...)的结果,如下所示:

  1. Use my $el = $doc->find(...) to return a single node.
  2. Alternatively, use the syntax my ($el) = $doc->findnodes(...). This results in a call in list context and assigns the first element of the returned list to $el.
  3. If there can be more nodes for your XPath expression, you can use a for expression to loop over the result of ->findnodes(...) like so:

for my $el ($doc->findnodes(...) {
    print $el->tostring()
}

这篇关于使用Perl脚本仅在XML的节点值中更改几个字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆