2013-01-10 2 views
1

외부의 큰 xml 파일에서 정보를 얻으려고합니다. 파일 1 (vehicleList.xml)에서 파일 2 (CheckVehicles.xml)를 PHP 파일로 변환하십시오. XML 파일 2의 모든 값은 XML 파일 1에 있습니다. XML 파일 2에있는 값 1 만 파일에 표시하고 싶습니다.하나 이상의 큰 XML 파일에서 정보 얻기

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> 
+0

크기가 큰 것처럼 보이지만, 레는 큽니다. 얼마나 많은 메가 바이트가 있습니까? 10MB보다 많거나 적습니까? - 또한 파일의 순서/번호 매기기가 혼합되어 있는지 확인하십시오. 첫 번째는 두 번째, 두 번째는 첫 번째입니다. 당신이 잘못된 요소를 들여다 보는 것은 아닙니다. – hakre

+0

사실 5MB보다 작습니다. – mukamaivan

+0

정말 큰 것은 아닙니다. 어쨌든 xpath에 대해 살펴보기를 권하고, 답변을 추가했습니다. 두 파일을 더 쉽게 정렬 할 수 있도록 도와줍니다. – hakre

답변

1

귀하의 경우에 어디서 잘못되었는지 알 수 없습니다. 당신이 기준에 따라 두 번째 파일에서 요소를 선택하려는 경우 (예 : 아이디/고유 번호) 내가 당신을 제안 첫 번째 파일에서 귀하의 경우 XPath를 사용합니다

  • 는 처음부터 숫자를 구합니다 (예 : /*/root/item/value)
  • 두 번째 파일에서 조건과 일치하는 모든 요소를 ​​선택하십시오 (예 : ID : /*/GetVehiclesListResponse/GetVehiclesListResult/Vehicle).

나중 시점 최고의 선택하고 각 요소에 대해 이러한 숫자를 비교할 수의 콤마 분리 된리스트를 생성한다 Is there anything for XPATH like SQL “IN”?에 설명 된 기술을 사용함으로써 달성 될 수있다.

예 :

가 제 1 파일에이 2 500 10 개 000 소자 아웃을 고려 제 파일 10000 개 요소가있다. 각 요소는 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 쿼리는 다음

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

과 두 번째 파일에 대한 조회

같이 PHP에 SimpleXML을 표현할 수있다

예제 코드는 다음에서 찾을 수 있습니다. http://eval.in/6370

관련 문제