无法在 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()->debug($xml->asXML());
检查加载的内容。
@NigelRen 正确记录了实际的 XML。但是,如果我尝试获取$xml->SoccerDocument->attributes()
,而不是像['Type' => 'Result', 'detail_id' => 1, 'uID' => 'f339048']
这样的数组,我只会得到字符串'Result'
。我以前从未遇到过任何这些 XML 文件的问题。似乎我正确加载了 XML,但由于某种原因,日志没有按预期工作。
如果你echo $xml->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 个内部服务器代码 [重复]