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

标签 excel perl xml-parsing

我有一个 XML 文件,如下

示例.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";

但是如果我删除默认 namespace 定义并将其替换为以下行:

<Workbook>

然后就可以了。

如何读取定义了默认命名空间的标签?

最佳答案

这里有两件事你需要知道

  • XML 中使用的命名空间前缀不需要与 XPath 查询中使用的任何前缀匹配;只需要对应的URN相同即可

  • 无法在 XPath 中定义“默认”命名空间

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

这段代码看起来是正确的,但我目前无法测试它。请确保在您编写的每个 Perl 程序的顶部始终使用严格使用警告“all”

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";

关于excel - 具有默认命名空间的 XML::LibXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379738/

相关文章:

excel - 使用变量引用范围

java - java中如何从XML中获取父元素属性和子元素值?

使用 MediaInfo plus wrapper 的 Python 错误

perl - 从源代码构建 perl 时,configure 不生成 makefile

Perl - 用编码方法读取文件?

javascript getElementsByTagName 排除某些标签

r - 在R中导入csv文件时如何处理千位分隔符

VBA vlookup 查找字符串中的值及其逆值

python xlrd 字符串匹配

perl - 在Strawberry Perl中,perl\lib和perl\site\lib有什么区别?