kob*_*ame 1 perl libxml2 xml-libxml
有这样的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>
Run Code Online (Sandbox Code Playgroud)
该xmlns声明是无效的,在xmlstarlet抱怨它,例如使用:
xmlstarlet sel -t -v "//File/Id" t.xml
Run Code Online (Sandbox Code Playgroud)
版画
t.xml:2.32: xmlns: URI Our.Files is not absolute
<ArrayOfFiles xmlns="Our.Files" xmlns:i="http://www.w3.org/2001/XMLSchema-instan
Run Code Online (Sandbox Code Playgroud)
可能出于同样的原因,我也无法使用以下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;
Run Code Online (Sandbox Code Playgroud)
当我省略xmlns声明时,例如尝试解析这个修改过的XML文件
<?xml version="1.0"?>
<ArrayOfFiles>
<File>
<DownloadCount>1</DownloadCount>
<Id>11</Id>
</File>
<File>
<DownloadCount>2</DownloadCount>
<Id>22</Id>
</File>
</ArrayOfFiles>
Run Code Online (Sandbox Code Playgroud)
上面的代码DWIM - 并打印:
11
22
Run Code Online (Sandbox Code Playgroud)
问题是,如何解析原始XML文件,因为它是从外部站点下载的 - 所以我必须稍微处理它...
那只是一个警告.使用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;
Run Code Online (Sandbox Code Playgroud)