Excel 具有默认名称空间的XML::LibXML

Excel 具有默认名称空间的XML::LibXML,excel,perl,xml-parsing,Excel,Perl,Xml Parsing,我有一个XML文件,如下所示 example.xml 但是,如果我删除默认名称空间定义并将其替换为以下行: <Workbook> 然后它就起作用了 如何读取定义了默认名称空间的标记?这里有两件事需要知道 XML中使用的名称空间前缀不需要与XPath查询中使用的任何前缀匹配;只有相应的URN需要相同 无法在XPath中定义“默认”命名空间 这意味着在XML中声明的没有前缀的名称空间必须在XPath表达式中指定前缀 这段代码看起来是正确的,但我目前无法测试它。请确保在您编写的每

我有一个XML文件,如下所示

example.xml 但是,如果我删除默认名称空间定义并将其替换为以下行:

<Workbook>

然后它就起作用了


如何读取定义了默认名称空间的标记?

这里有两件事需要知道

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

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

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

这段代码看起来是正确的,但我目前无法测试它。请确保在您编写的每个Perl程序的顶部始终
使用strict
使用警告'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";

您需要注册名称空间

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

我还有一个关于名称空间的问题,我正在尝试解决,您也可以提供帮助。我是否应该为此提出另一个问题?
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";
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";