我有一个像这样的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="C:\cFGCACHE-058cef2b85c09427e606b143bd75248e252d004e\alternative.pdf"/>
<ids modified="BF43C70442ECB74FA49833BBA44D4679" original="B4870CC046121A41B7D8F0838C87256D"/>
<fields>
<field name="FormInstanceID">
<value>SRSQSC88E48-1-1.320</value>
</field>
<field name="txt_bestelltKW">
<value></value>
</field>
</fields>
</xfdf>
现在我需要提取f href属性的值。我用单线处理尝试过,但肯定有更好的方法。有什么想法吗?
由于
答案 0 :(得分:4)
在修复XML中的拼写错误之后,我能够使用以下代码提取值:
#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my $dom = 'XML::LibXML'->load_xml( file => 'example.xml' );
my $xc = 'XML::LibXML::XPathContext'->new;
$xc->registerNs('x', 'http://ns.adobe.com/xfdf/');
for my $href ($xc->findvalue('//x:f/@href', $dom)) {
print $href, "\n";
}
我经常发现XML::LibXML过于冗长,所以我会使用XML::XSH2:
open example.xml ;
register-namespace x http://ns.adobe.com/xfdf/ ;
for //x:f echo @href ;
答案 1 :(得分:2)
我喜欢XML::Twig
。不要质疑以前海报的解决方案,我会这样做:
use strict;
use warnings;
use XML::Twig;
sub extract_f {
my ( $twig, $f ) = @_;
print $f->atts->{'href'}, "\n";
}
my $twig = XML::Twig->new( twig_handlers => { 'f' => \&extract_f }, );
$twig->parse( \*DATA );
__DATA__
<?xml version="1.0" encoding="UTF-8"?><xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve" >
<f href="C:\cFGCACHE-058cef2b85c09427e606b143bd75248e252d004e\alternative.pdf"/>
<ids modified="BF43C70442ECB74FA49833BBA44D4679" original="B4870CC046121A41B7D8F0838C87256D"/>
<fields>
<field name="FormInstanceID">
<value>SRSQSC88E48-1-1.320</value>
</field>
<field name="txt_bestelltKW">
<value></value>
</field>
</fields>
</xfdf>
我喜欢XML :: Twig的主要原因是因为它允许随意清除XML - 所以如果你有很多XML可以使用,那么它就非常宝贵。
答案 2 :(得分:0)
我建议使用XML::LibXML
或XML::Twig
。
如果不是因为必须处理命名空间,我会认为你的目标相当微不足道。但是,下面演示了如何使用XML::LibXML
在忽略命名空间的同时提取所需的值:
use strict;
use warnings;
use XML::LibXML;
my $dom = XML::LibXML->load_xml( IO => \*DATA );
my ($f) = $dom->findnodes('//*[local-name()="f"]');
print $f->getAttribute('href'), "\n";
__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="C:\cFGCACHE-058cef2b85c09427e606b143bd75248e252d004e\alternative.pdf"/>
<ids modified="BF43C70442ECB74FA49833BBA44D4679" original="B4870CC046121A41B7D8F0838C87256D"/>
<fields>
<field name="FormInstanceID">
<value>SRSQSC88E48-1-1.320</value>
</field>
<field name="txt_bestelltKW">
<value></value>
</field>
</fields>
</xfdf>
输出:
C:\cFGCACHE-058cef2b85c09427e606b143bd75248e252d004e\alternative.pdf