Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加载具有XML名称空间的XLSX电子表格_Php_Xml_Simplexml_Phpspreadsheet - Fatal编程技术网

Php 加载具有XML名称空间的XLSX电子表格

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

我有一组PhpSpreadsheet无法加载的XLSX文件,因为simplexml\u load\u字符串从工作簿XML文件返回一个空的simplexmlement(例如)

该文件具有以下格式,在删除所有出现的
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()
  • 特定名称空间绑定到特定前缀,因此可以通过查找该前缀进行选择
PhpSpreadsheet的作者似乎犯了这两个错误,这意味着当您尝试加载由不同程序创建的文档时,它找不到它所期望的名称空间,即使它们确实存在