php之使用Laravel解析XML文件

lexus 阅读:27 2024-02-27 23:08:18 评论:0

好吧,所以我对此很固执。我有一个半复杂的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
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号