在Laravel中无法正确获取XML

时间:2019-04-24 14:53:57

标签: php xml laravel

我在storage/xml目录中有一堆XML文件。

我想从该目录中获取所有文件,然后解析每个文件。我正在尝试使用simple_xml来执行此操作,但出现如下所示的各种错误。

尝试#1:

$files = Storage::files('xml');  //get all files in the dir
foreach($files as $file){
    $xml = simplexml_load_file($file);
}

这使我们:

simplexml_load_file(): I/O warning : failed to load external entity "xml/srml-21-2010-f339048-matchresults.xml"

但是,file xml/srml-21-2010-f339048-matchresults.xml确实存在并且是有效的XML文件。我已经使用其他服务器上的纯PHP成功解析了它。

尝试#2:

$files = Storage::files('xml');  //get all files in the dir
foreach($files as $file){
    $file_contents = Storage::get($file);
    $xml = simplexml_load_string($file_contents) or die("Error: Cannot create object");
    logger()->debug($xml);
}

这不会引发任何错误,但是当我尝试记录结果时,在日志文件中我发现logger()->debug($xml)仅打印3空行。而已。但是,如果我尝试使用logger()-> debug($ file_contents),则会得到看起来正确的数据:

[2019-04-24 14:50:31] local.DEBUG: <?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2001-2019 Opta Sportsdata Ltd. All rights reserved. -->

<!-- PRODUCTION HEADER
     produced on:        valde-jobq-a01.nexus.opta.net
     production time:    20190304T081850,751Z
     production module:  Opta::Feed::XML::Soccer::F7
-->
<SoccerFeed TimeStamp="20190304T081848+0000">
  <SoccerDocument Type="Result" detail_id="1" uID="f339048">
    <Competition uID="c21">
        etc etc

我不想使用像XmlParser这样的库(或任何其他库)。我解析数据不会有任何问题,我只需要帮助就可以真正掌握它。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我创建了一个软件包,该软件包消除了PHP对XML的困扰。 https://github.com/mtownsend5512/xml-to-array在后台使用DOMDocument对象来解析XML。如果您喜欢这种东西,它甚至带有全局Laravel帮助器。

$files = Storage::files('xml');  //get all files in the dir
foreach($files as $file) {
    $xml = xml_to_array($file);
    // or $xml = XmlToArray::convert($file);
}