拥有此类XML文件 - t.xml
<?xml version="1.0"?>
<ArrayOfFiles xmlns="Our.Files" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<File>
<DownloadCount>1</DownloadCount>
<Id>11</Id>
</File>
<File>
<DownloadCount>2</DownloadCount>
<Id>22</Id>
</File>
</ArrayOfFiles>
xmlns
声明无效,xmlstarlet
对此抱怨,例如使用:
xmlstarlet sel -t -v "//File/Id" t.xml
打印
t.xml:2.32: xmlns: URI Our.Files is not absolute
<ArrayOfFiles xmlns="Our.Files" xmlns:i="http://www.w3.org/2001/XMLSchema-instan
可能出于同样的原因,我也无法使用以下perl代码:
use 5.014;
use warnings;
use XML::LibXML;
my $dom = XML::LibXML->new->parse_file('t.xml');
my $res = $dom->findnodes('//File/Id');
say $_->textContent for $res->get_nodelist;
当我省略xmlns
声明时,例如试图解析这个修改过的XML文件
<?xml version="1.0"?>
<ArrayOfFiles>
<File>
<DownloadCount>1</DownloadCount>
<Id>11</Id>
</File>
<File>
<DownloadCount>2</DownloadCount>
<Id>22</Id>
</File>
</ArrayOfFiles>
以上代码 DWIM - 并打印:
11
22
问题是,如何解析原始XML文件,因为它是从外部网站下载的 - 所以我必须稍微处理一下......
答案 0 :(得分:6)
这只是一个警告。使用XML命名空间时,请使用XML::LibXML::XPathContext:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use XML::LibXML;
use XML::LibXML::XPathContext;
my $dom = 'XML::LibXML'->load_xml(location => shift);
my $xpc = 'XML::LibXML::XPathContext'->new($dom);
$xpc->registerNs(o => 'Our.Files');
my $res = $xpc->findnodes('//o:File/o:Id');
say $_->textContent for $res->get_nodelist;