【问题标题】:Getting information from more than one large XML file从多个大型 XML 文件中获取信息
【发布时间】:2012-12-24 18:58:15
【问题描述】:

我正在尝试从外部大型 xml 文件中获取信息;从文件 1 (vehicleList.xml) 和文件 2 (CheckVehicles.xml) 到 PHP 文件。 XML 文件 2 中的所有值都在 XML 文件 1 中。我只想显示文件 1 中 XML 文件 2 中的值。

我的foreach 循环代码最多可以带来 130 个项目的结果(也就是说,如果我将 XML 文件 2 中的项目减少到 130 个项目/节点)。但是,如果我删除 if 语句,我可以从 XML 文件 1 中获取所有 3340 项/车辆。

我哪里错了?我尝试了数组但失败了。

这是我的代码:

//XML FILE 1 with 1300 items
$myXML = new SimpleXMLElement('CheckVehicles.xml', NULL, TRUE);//
foreach($myXML->root->item as $item){
        $listArrayNew[(int)$item->value] = (int)$item->value;
}

//XML FILE 2 with 3340 vehicles
$parser = new SimpleXMLElement('vehicleList.xml', NULL, TRUE);
foreach ($parser->GetVehiclesListResponse->GetVehiclesListResult->Vehicle as $Vehicle) {
    if($listArrayNew[(int)$Vehicle->ID] == (int)$Vehicle->ID){
        $vehicle    = $Vehicle->Description;    
        $regNumber  = $Vehicle->RegistrationNumber; 
        $siteID     = $Vehicle->SiteID;     
        $row       .= "<tr>
                            <td>".$vehicle."</td>
                            <td>".$regNumber."</td>
                            <td>".$siteId."</td>
                        </tr>"; 

    }
}

这里是 XML 文件:

XML 文件 1:vehicleList.xml

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
  <GetVehiclesListResponse>
    <GetVehiclesListResult>
      <Vehicle>
        <ID>153</ID>
        <SiteID>11</SiteID>
        <GroupID>3</GroupID>
        <Description>A.O Basid KAR 459 E</Description>
        <RegistrationNumber>KAR 459 E</RegistrationNumber>
      </Vehicle>

      ..............................


      <Vehicle>
        <ID>3340</ID>
        <SiteID>25</SiteID>
        <GroupID>4</GroupID>
        <Description>UAR 712B White Nissan Tiida (Deus Mubangizi)</Description>
        <RegistrationNumber>UAR 712B</RegistrationNumber>
      </Vehicle>
    </GetVehiclesListResult>
  </GetVehiclesListResponse>
</soap:Envelope>

XML 文件 2:CheckVehicles.xml

<?xml version="1.0" encoding="utf-8"?>
<Result>
  <root>
    <item>
      <index>0</index>
      <value>153</value>
    </item>

   ...................

    <item>
      <index>1300</index>
      <value>128</value>
    </item>
  </root>
</Result>

【问题讨论】:

  • 即使它们看起来很大,我也不会说这些文件很大。他们有多少兆字节?大于还是小于 10 MB? - 还要检查一下,您混合了文件的顺序/编号。第一是第二,第二是第一。并不是说您查看了错误的元素。
  • 实际上它们小于 5 MB。
  • 这不是很大。无论如何我建议你看看 xpath,我已经添加了一个答案,希望它可以帮助你更轻松地对齐这两个文件。

标签: php xml foreach


【解决方案1】:

我不知道你的情况哪里出错了。但是,如果您想根据第一个文件中的标准(例如 ID / 唯一编号)从第二个文件中选择元素,我建议您在您的情况下使用 xpath:

  • 从第一个文件中获取作为标准的数字(例如/*/root/item/value
  • 从第二个文件中选择所有符合条件的元素(例如/*/GetVehiclesListResponse/GetVehiclesListResult/Vehicle 中的ID)。

后一点可以通过使用Is there anything for XPATH like SQL “IN”? 中概述的技术来最好地实现,该技术创建一个逗号分隔的数字列表以供选择,然后将其与每个元素的数字进行比较。

例子:

考虑第一个文件中的 10 000 个元素中有 2 500 个元素,而第二个文件中有 10 000 个元素。每个元素都可以通过其 ID 唯一标识。

第一个文件有这样的布局:

<?xml version="1.0"?>
<root>
    <item>
        <index>0</index>
        <id>604</id>
    </item>
    <item>
        <index>1</index>
        <id>2753</id>
    </item>
    ...
</root>

第二个文件有这个布局。

<?xml version="1.0"?>
<list>
    <item>
        <id>1</id>
        <some>Number: 33</some>
    </item>
    <item>
        <id>2</id>
        <some>Number: 35</some>
    </item>
    ...
</list>

因此,从第一个文件中获取所有 ID 的 xpath 查询是:

//item/id

第二个文件的查询可以用 PHP 中的 SimpleXML 表示为:

$ids   = implode(',', $file1->xpath('//item/id'));
$query = '//item[contains(",' . $ids . ',", concat(",", id, ","))]';

您可以在此处找到该示例的示例代码:http://eval.in/6370

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多