1

外部の大きな xml ファイルから情報を取得しようとしています。ファイル 1 ( vehicleList.xml ) とファイル 2 ( CheckVehicles.xml ) から PHP ファイルに変換します。XML ファイル 2 のすべての値は XML ファイル 1 にあります。XML ファイル 2 にあるファイル 1 の値のみを表示したいと思います。

私の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>
4

1 に答える 1

1

あなたの場合、どこが間違っているのかわかりません。ただし、最初のファイルの基準 (ID / 一意の番号など) に基づいて 2 番目のファイルから要素を選択する場合は、次のように xpath を使用することをお勧めします。

  • 基準となる最初のファイルから数値を取得します (例: /*/root/item/value)
  • 基準に一致する 2 番目のファイルからすべての要素を選択します (例:ID/*/GetVehiclesListResponse/GetVehiclesListResult/Vehicle)。

後者のポイントは、 Is there anything for XPATH like SQL “IN”? で概説されている手法を使用することによって最もよく達成できます。これは、選択する番号のコンマ区切りリストを作成し、これを各要素番号と比較します。

例:

最初のファイルには 10,000 個の要素のうち 2,500 個があり、2 番目のファイルには 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>

2 番目のファイルにはこのレイアウトがあります。

<?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

2 番目のファイルのクエリは、PHP の SimpleXML で次のように表現できます。

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

この例のコード例は、http: //eval.in/6370にあります。

于 2013-01-10T12:35:40.760 に答える