我试图想出一个perl脚本迭代一些节点并在xml文件中获取值.
<?xml version="1.0" encoding="UTF-8"?> <WO xmlns="http://www.example.com/yyyy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <WOSet> <SR> <FINISHTIME>2013-07-29T18:21:38-05:00</FINISHTIME> <STARTTIME xsi:nil="true" /> <TYPE>SR</TYPE> <DESCRIPTION>Create CUST</DESCRIPTION> <EXTERNALSYSTEMID /> <REPORTEDBY>PCAUSR</REPORTEDBY> <REPORTEDEMAIL /> <STATUS>RESOLVED</STATUS> <SRID>1001</SRID> <UID>1</UID> <SPEC> <AVALUE>IT</AVALUE> <ATTRID>CUST_DEPT</ATTRID> <NALUE xsi:nil="true" /> <TVALUE /> </SPEC> <SPEC> <AVALUE>001</AVALUE> <ATTRID>DEPT_CODE</ATTRID> <NVALUE xsi:nil="true" /> <TVALUE /> </SPEC> </SR> </WOSet> </WO>
当我运行下面的脚本时,我既没有得到输出也没有任何错误来获得解决问题的地方……
我不是一个perl专家,会喜欢这里的专家通过一些亮点……
#!/usr/bin/perl use XML::LibXML; use strict; use warnings; my $file = 'spec.xml'; my $parser = XML::LibXML->new(); my $tree = $parser->parse_file($file); my $root = $tree->getDocumentElement; foreach my $atrid ( $tree->findnodes('WO/WOSet/SR/SPEC') ) { my $name = $atrid->findvalue('ATTRID'); my $value = $atrid->findvalue('AVALUE'); print $name print " = "; print $value; print ";\n"; }
我的预期产量是
CUST_DEPT = IT DEPT_CODE = 001
解决方法
XML在null命名空间中不包含任何名为WO的元素.您希望匹配http://www.example.com/yyyy命名空间中名为WO的元素.
#!/usr/bin/perl use strict; use warnings; use XML::LibXML qw( ); use XML::LibXML::XPathContext qw( ); my $file = 'spec.xml'; my $parser = XML::LibXML->new(); my $doc = $parser->parse_file($file); my $root = $doc->getDocumentElement; my $xpc = XML::LibXML::XPathContext->new($doc); $xpc->registerNs(y => 'http://www.example.com/yyyy'); for my $atrid ( $xpc->findnodes('y:WO/y:WOSet/y:SR/y:SPEC') ) { my $name = $xpc->findvalue('y:ATTRID',$atrid); my $value = $xpc->findvalue('y:AVALUE',$atrid); print "$name = $value\n"; }