【问题标题】:Processing Excel XML files with Perl and LibXML使用 Perl 和 LibXML 处理 Excel XML 文件
【发布时间】:2013-04-08 20:24:00
【问题描述】:

我正在尝试处理保存为 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" 然后它开始工作。请你能告诉我我错过了什么吗?我想我可以在解析文档之前将其删除,但我想了解我做错了什么:)。提前致谢。

【问题讨论】:

  • 您为什么不使用预构建的 XLSX 解析模块之一? metacpan.org/search?q=xlsx
  • 我不知道它们的存在,我的谷歌搜索技能很差。感谢您的链接(令人困惑的是,生成文件的工具将其保存为 .xls 而不是 xlxs)

标签: xml perl excel


【解决方案1】:

如果你想使用 XPath 表达式和命名空间,你必须先注册命名空间,然后在所有提到命名空间元素的 XPath 表达式中每次使用它: p>

#!/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);

【讨论】:

  • 啊!我没有意识到我需要将命名空间添加到每个级别,这样做只是解决了问题,因为 LibXML 从源文档中提取命名空间:)。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多