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