Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中比较不同元素的XML arrtibute值_Xml_Perl_Xpath - Fatal编程技术网

如何在perl中比较不同元素的XML arrtibute值

如何在perl中比较不同元素的XML arrtibute值,xml,perl,xpath,Xml,Perl,Xpath,我正在编写脚本来比较两个不同文件中元素的属性值,并需要找出属性值中的任何差异。XML代码如下所示。需要比较的属性在book元素中为“revision”: <book fpi="9780133125900" status="PearsonML 9.8" revision="3"> <book fpi="9780133125900" status="PearsonML 9.8" revision="2"> 致以最良好的祝愿, Bhuvana一种方法是使用to_literal

我正在编写脚本来比较两个不同文件中
元素的属性值,并需要找出属性值中的任何差异。XML代码如下所示。需要比较的属性在book元素中为“revision”:

<book fpi="9780133125900" status="PearsonML 9.8" revision="3">
<book fpi="9780133125900" status="PearsonML 9.8" revision="2">
致以最良好的祝愿,
Bhuvana

一种方法是使用
to_literal()
函数从节点集提取数字。它返回对标量的引用,因此在比较中取消对标量的引用:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::XPath;

#for extracting 'revision' vaue in file1
my $xp = XML::XPath->new(filename => $find);
my $hname = $xp->find('/book/@revision')->to_literal;
##for extracting 'revision' vaue in file2
my $xx = XML::XPath->new(filename => $find1);
my  $hnaee = $xx->find('/book/@revision')->to_literal;

if ( $$hname == $$hnaee ) { 
    print "Equal\n";
}
else {
    print "Not equal";
}

您可能应该使用XML::LibXML而不是XML::XPath,它更快、内存效率更高、功能更强大、维护更好。代码将非常相似,因此切换并不困难。非常感谢您的代码。但是使用“if($$hname==$$hnaee)”,我得到了“nota SCALAR”变量。您能检查一下并告诉我吗。@Bhuvana:对于您的XML文件(用一个关闭的
/>
标记修复)和像
perl script.pl
一样执行的脚本,我没有收到任何错误。我不知道。检查您是否没有输入错误,或者您的xml数据是否太不同。另外,使用
Data::Dumper
并在比较之前打印变量。最后,我添加了代码的这一部分以表明它是有效的,您将需要一个不同的实现,所以请删除它并使用您自己的代码。
#!/usr/bin/env perl

use warnings;
use strict;
use XML::XPath;

#for extracting 'revision' vaue in file1
my $xp = XML::XPath->new(filename => $find);
my $hname = $xp->find('/book/@revision')->to_literal;
##for extracting 'revision' vaue in file2
my $xx = XML::XPath->new(filename => $find1);
my  $hnaee = $xx->find('/book/@revision')->to_literal;

if ( $$hname == $$hnaee ) { 
    print "Equal\n";
}
else {
    print "Not equal";
}