【问题标题】:XML::LibXML matching with multiple namespacesXML::LibXML 匹配多个命名空间
【发布时间】:2018-01-22 12:23:38
【问题描述】:

我有一个 example.xml 文件,其中包含以下内容:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Worksheet ss:Name="Master Sheet">
</Worksheet>
</Workbook>

我有以下 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('ss', 'urn:schemas-microsoft-com:office:spreadsheet');
my $match1 = $xpc->findnodes('//Worksheet/ss:Name');
print "XPath $match1\n";

我尝试了许多变体来提取字符串“Master Sheet”,但无济于事。有人可以请教吗?

【问题讨论】:

  • 如果您确实需要匹配多个命名空间,您可以使用registerNs 注册两个不同的前缀。请记住,使用registerNs 注册并在 XPath 中使用的前缀与在 XML 中使用的前缀(如果有)无关。

标签: excel perl xml-parsing


【解决方案1】:

默认名称空间和ss 是相同的,所以这将起作用

$xpc->findnodes('/ss:Worksheet/@ss:Name')

【讨论】:

  • 谢谢。如果命名空间不相同,会有什么不同?
  • @geofrey:那么您必须为新命名空间注册第二个前缀。唯一的区别是命名空间前缀在 XPath 中不能为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多