具有默认命名空间的XML :: LibXML

时间:2018-01-22 10:45:17

标签: excel perl xml-parsing

我有一个XML文件如下

的example.xml

<?xml version="1.0"?>
<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'>
    <id>test</id>
</Workbook>

以下代码未找到id代码值:

use XML::LibXML;

my $filename = 'example.xml';

my $dom = XML::LibXML->load_xml( location => $filename );
my $xpc = XML::LibXML::XPathContext->new($dom);
my $match1 = $xpc->findnodes('//id');

print "XPath $match1\n";

但是,如果我删除默认的命名空间定义并将其替换为此行:

<Workbook>

然后它有效。

如何读取带有默认命名空间的标签?

2 个答案:

答案 0 :(得分:2)

这里有两件事你需要知道

  • XML中使用的名称空间前缀不需要匹配XPath查询中使用的任何前缀;只有相应的URN需要相同

  • 无法定义&#34;默认&#34; XPath中的命名空间

这意味着在没有前缀的XML中声明的名称空间必须在XPath表达式中给出前缀

此代码看起来正确,但我目前无法测试它。请确保始终 use strictuse warnings 'all'位于您编写的每个Perl程序的顶部

use strict;
use warnings 'all';

use XML::LibXML;

my $filename = 'example.xml';

my $dom = XML::LibXML->load_xml( location => $filename );
my $xpc = XML::LibXML::XPathContext->new( $dom );
$xpc->registerNs( mss => 'urn:schemas-microsoft-com:office:spreadsheet' );
my $match1 = $xpc->findnodes('//mss:id');

print "XPath $match1\n";

答案 1 :(得分:1)

您需要注册命名空间。

my $xml = q[<?xml version="1.0"?>
<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet'>
    <id>test</id>
</Workbook>];

use XML::LibXML;

my $filename = 'example.xml';

my $dom = XML::LibXML->load_xml( string => $xml );
my $xpc = XML::LibXML::XPathContext->new($dom);
$xpc->registerNs('x', 'urn:schemas-microsoft-com:office:spreadsheet');
my $match1 = $xpc->findnodes('//x:id');

print "XPath $match1\n";

如果您不想注册命名空间,也可以使用此选项:

my $dom = XML::LibXML->load_xml( string => $xml );
my $xpc = XML::LibXML::XPathContext->new($dom);

my $match2 = $xpc->findnodes("//*[name()='id']");

print "XPath $match2\n";