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;
有这样的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;