php - 使用Laravel解析XML文件

标签 php laravel xml-parsing

好吧,所以我对此很固执。我有一个半复杂的XML文件,看起来有点像这样:

<?xml version="1.0" encoding="UTF-8"?>

<community ID="1234" POSTDATE="20180329" xmlns="" COMPANY="SAMPLE CO">
   <data1>
      <datatype ID="0001">
         <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
      <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
      <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
      <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
</data1>
          <datatype ID="0002">
             <utpricing LT="2" STARTDATE="20160102" ENDDATE="20170102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
          <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
          <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
          <utpricing LT="1" STARTDATE="20150102" ENDDATE="20160102" BASEAMOUNT="99" CONCESSION="0.00" EFFAMOUNT="99" CONTYPE="SAMPLE" CONVALUE="0.00"/>
    </datatype>
</data1>
  <data2>
      <data2 ID="141" NAME="IAM | 1 | 1.00" SQFTMIN="111" SQFTMAX="222"/>
      <data2 ID="142" NAME="ASA | 1 | 1.00" SQFTMIN="111" SQFTMAX="222"/>
      <data2 ID="143" NAME="MPL | 1 | 1.00" SQFTMIN="111" SQFTMAX="222"/>
      <data2 ID="144" NAME="EBI | 1 | 1.00" SQFTMIN="111" SQFTMAX="222"/>
      <data2 ID="145" NAME="TOF | 2 | 2.00" SQFTMIN="111" SQFTMAX="222"/>
   </data2>

   <samples>
      <sample ID="001" AVAILDATE="20152901" STATUS="Unavailable" data1TYPE="001" UNITCAT="1X1" SOMEVALUE="50.00" data2ID="141">
         <item1 ID="59" item2="50.00" DESCRIPTION="Sample Description"/>
         <offeredterm LT="2" BASEAMOUNT="1120.00" TOTALCONCESSION="0.00" EFFECTIVESAMPLE="1120.00" CONTYPE="T" CONVALUE="0.00"/>
      </sample>
    <sample ID="002" AVAILDATE="20152901" STATUS="Unavailable" data1TYPE="001" UNITCAT="1X1" SOMEVALUE="50.00" data2ID="141">
         <item1 ID="59" item2="50.00" DESCRIPTION="Sample Description"/>
         <offeredterm LT="2" BASEAMOUNT="1120.00" TOTALCONCESSION="0.00" EFFECTIVESAMPLE="1120.00" CONTYPE="T" CONVALUE="0.00"/>
      </sample>

因此,我尝试了几种解析方式,但最终要得到的是一个结构化集合,然后我可以对其进行操作,例如从data1中选择所有与data1TYPE具有相同datatype ID的项目,等等。

目前,我的代码如下所示:
$XML = Storage::disk('local')->get('data\XML.xml');
$random = collect(json_decode(json_encode((array) simplexml_load_string($XML)), true));

我已经能够检索到这样的对象,然后按索引循环并为每个xml标记构建一个单独的集合。但这并没有那么高效,我不确定以后如何最好地运行比较操作。

有任何想法吗?

最佳答案

欢迎来到xml的世界!您正在做的事情是我目前所知道的最好的方法。从xml到json的一个基本示例是您的操作方式:

$xml = simplexml_load_string($xml_string);

$json = json_encode($xml);

$array = json_decode($json,TRUE);

我确实看到您在进行simplexml_load_string调用之前正在提示类型数组。有什么理由吗?

同样,当您声明不确定如何运行比较时,这到底是什么意思?您的xml是静态的,意味着永不改变,还是大小和/或范围改变了?

关于php - 使用Laravel解析XML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559092/

相关文章:

php - 使用 OAuth2 客户端凭证流保护用 PHP 编写的 REST API

php - Laravel 5.5 优化查询

php - 使用 UTF8 编码阿拉伯语

Laravel 喜欢 Eloquent 的数组值?

xml-parsing - 来自YouTube的警告simplexml_load_file解析器错误

java - 由于文件路径中有空格,创建 xml 文件时出错

php - CodeIgniter:未定义的属性:stdClass::$date

php - 如何在 Laravel 中制作带有步骤的表单?

mysql - 我有两个名为 created_at 和 updated_at(timestamps) 的字段,我想在我的 where 子句中的这些日期之间进行搜索

Perl XML::Simple 解析器解码不一致