我有一个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>
然后它有效。
如何读取带有默认命名空间的标签?
答案 0 :(得分:2)
这里有两件事你需要知道
XML中使用的名称空间前缀不需要匹配XPath查询中使用的任何前缀;只有相应的URN需要相同
无法定义&#34;默认&#34; XPath中的命名空间
这意味着在没有前缀的XML中声明的名称空间必须在XPath表达式中给出前缀
此代码看起来正确,但我目前无法测试它。请确保始终 use strict
和use 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";