XML::LibXML - XPath - 命名空间

XML::LibXML - XPath - namespace

有这样的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文件,因为它是从外部站点下载的-所以我必须稍微处理一下...

这只是一个警告。使用 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;