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