Php 加载具有XML名称空间的XLSX电子表格
我有一组PhpSpreadsheet无法加载的XLSX文件,因为simplexml\u load\u字符串从工作簿XML文件返回一个空的simplexmlement(例如) 该文件具有以下格式,在删除所有出现的Php 加载具有XML名称空间的XLSX电子表格,php,xml,simplexml,phpspreadsheet,Php,Xml,Simplexml,Phpspreadsheet,我有一组PhpSpreadsheet无法加载的XLSX文件,因为simplexml\u load\u字符串从工作簿XML文件返回一个空的simplexmlement(例如) 该文件具有以下格式,在删除所有出现的x:命名空间和声明本身(例如,标记已转换为)后,simplexml可以加载该格式 我不确定XML文件是否错误,因为XLSX文件可以用Libre-Office打开。无论如何,我已经通过一个简单的函数cleanup_xml()加载了以下文件: /~http://schemas.openxm
x:
命名空间和声明本身(例如,
标记已转换为
)后,simplexml可以加载该格式
我不确定XML文件是否错误,因为XLSX文件可以用Libre-Office打开。无论如何,我已经通过一个简单的函数cleanup_xml()加载了以下文件:
/~http://schemas.openxmlformats.org/spreadsheetml/2006/main"
$xmlWorkbook=simplexml\u加载\u字符串(
清理xml($this->securityScanner->scan($this->getFromZipArchive($zip,“{$rel['Target']}”)),
“SimpleXMLElement”,
设置::getLibXmlLoaderOptions()
);
也许有一种合适/干净的方法可以强制SimpleXMLAPI加载这样的文件
编辑:
我错误地认为,在清除xml攻击之后,所有问题都解决了。
似乎数据行XML文件也有问题,可能与上面相同
编辑:
事实上,我将cleanup_xml()移到了XmlScanner::scan中,以应用于每个加载的xml,现在似乎可以工作了
编辑:
似乎名称空间声明是正确的,至少从
然后,我想知道为什么simplexml\u load\u string不接受以下格式:
....
虽然它显然接受
....
编辑
我已经深入研究了simplexml API,帮助理解了这个问题。现在我可以尝试重写我的hackish cleanup_xml名称空间帐户…只是想知道PHPSReadSheet是否提供了一个更好的方法…似乎奇怪,这个问题以前没有被注意到
编辑
好的,现在我发现…这似乎是
打开本周我用Microsoft Excel的真实副本创建的XLSX文件,“workbook.xml”的开头如下:
这声明了将在文档中使用的八个不同的名称空间。其中一个恰好被定义为“默认名称空间”,另外七个被分配了前缀-但所有这些都只是这个特定文件的本地名称空间
如果我们查看您的XML文档,我们可以看到所有相同的名称空间都在使用,另外还有一个名称空间:
唯一的区别是名称空间“http://schemas.openxmlformats.org/spreadsheetml/2006/main“已分配前缀”x,而不是设置为默认名称空间,,但这对其含义没有影响。不同的库可能会以完全不同的方式标记名称空间,这只是因为它生成XML的方式不同:
如前所述,SimpleXML的命名空间处理基于使用->children()
方法来选择要使用的命名空间。正确的使用方法是始终指定所需的命名空间URI,例如。“http://schemas.openxmlformats.org/spreadsheetml/2006/main“或”http://schemas.microsoft.com/office/spreadsheetml/2016/revision10“
但是,由于同一程序通常使用相同的前缀选择创建XML文档,因此很容易编写错误的代码,这依赖于:
- 特定名称空间是默认名称空间,因此在第一次调用
->children()
- 特定名称空间绑定到特定前缀,因此可以通过查找该前缀进行选择