XML :: LibXML - XPath - 命名空间

时间:2017-06-15 13:19:44

标签: 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>

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

1 个答案:

答案 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;