我正在尝试处理保存为XML电子表格的Excel文件中的数据。在做了大量的研究之后(我以前没有做太多的XML处理)我仍然无法使它工作。这是我的最小文件的内容:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:sbmextension="http://www.serena.com/SBM/XSLT_Extension">
<Worksheet ss:Name="index">
</Worksheet>
</Workbook>
我的剧本:
use XML::LibXML;
use Data::Dumper;
my $filename = $ARGV[0];
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($filename);
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement );
my $xpath = '/Workbook/Worksheet/@ss:Name';
print Dumper $xc->findvalue($xpath);
但是,如果我删除(默认命名空间?)xmlns =“urn:schemas-microsoft-com:office:spreadsheet”,那么它就会开始工作。请你告诉我我错过了什么?我想我可以在解析文档之前删除它,但我想了解我做错了什么:)。提前谢谢。
答案 0 :(得分:3)
如果你想使用XPath表达式和命名空间,你必须首先注册命名空间,然后在所有提到命名空间元素的XPath表达式中每次使用:
#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
use Data::Dumper;
my $xml = << '__XML__';
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:sbmextension="http://www.serena.com/SBM/XSLT_Extension">
<Worksheet ss:Name="index">
</Worksheet>
</Workbook>
__XML__
my $doc = XML::LibXML->load_xml( string => $xml);
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement );
$xc->registerNs('ss', 'urn:schemas-microsoft-com:office:spreadsheet');
my $xpath = '/ss:Workbook/ss:Worksheet/@ss:Name';
print Dumper $xc->findvalue($xpath);