无法在 Laravel 中正确获取 XML [重复]

Posted

技术标签:

【中文标题】无法在 Laravel 中正确获取 XML [重复]【英文标题】:Can't get XML correctly in Laravel [duplicate] 【发布时间】:2019-09-13 22:11:27 【问题描述】:

我在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 之类的库(或任何其他库)。我解析数据不会有问题,我只需要帮助才能真正掌握它。我做错了什么?

【问题讨论】:

尝试logger()-&gt;debug($xml-&gt;asXML());检查加载的内容。 @NigelRen 正确记录了实际的 XML。但是,如果我尝试获取$xml-&gt;SoccerDocument-&gt;attributes(),而不是像['Type' =&gt; 'Result', 'detail_id' =&gt; 1, 'uID' =&gt; 'f339048'] 这样的数组,我只会得到字符串'Result'。我以前从未遇到过任何这些 XML 文件的问题。似乎我正确加载了 XML,但由于某种原因,日志没有按预期工作。 如果你echo $xml-&gt;SoccerDocument["uID"]; 你得到正确的值吗? @NigelRen 是的,我试过了。但是我怎样才能让整个元素/属性列表的日志记录工作呢?我想这才是真正的问题。 XML 变得相当复杂,它是一个完整的足球比赛,包含多个级别的球员、事件、属性等。所以简单的日志记录会非常有帮助。 好的 - 我可以建议创建一个新问题,假设您可以加载 XML,显示 XML 内容和您想要显示的内容。我要出去一个小时左右,等我回来再看看。 【参考方案1】:

我创建了一个包,用 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);

【讨论】:

以上是关于无法在 Laravel 中正确获取 XML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同的表中获取 customer_id 并在 laravel 中使用正确的方法避免重复?

在 laravel 中获取 500 个内部服务器代码 [重复]

迭代数据时,Laravel 无法将 stdClass 类型的对象用作 Job 的数组 [重复]

Laravel 嵌套的 foreach 返回重复项

Laravel 不重复计数

如何在laravel中获取嵌套关系模型[重复]