Листинг простой Xml объект - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь перечислить файл XML с помощью php Simple Xml:

<Record>
      <TestData>
         <Status>Passed</Status>
         <Date Year="2018" Month="1" Day="25" Hour="11" Min="41" Sec="24"/>
      </TestData>
      <ResultData>
         <ResultItem ElementID="42">
            <Status>Passed</Status>
            <ResultItem ElementID="43">
               <Status>Passed</Status>
            </ResultItem>
         </ResultItem>
         <ResultItem ElementID="70">
            <Status>Passed</Status>
            <ResultItem ElementID="72" Version="1">
               <Status>Passed</Status>
            </ResultItem>
            <ResultItem ElementID="100" Version="1">
               <Status>Passed</Status>
            </ResultItem>
         </ResultItem>
      </ResultData>
</Record>

Этот мой php код:

   $xml = simplexml_load_file ('20000.xml');
foreach ($xml->Record->ResultData as $element) { 
  foreach ($element as $key => $val) {
    echo $val['ElementID'].' '.$key.'</br>';
    foreach ($xml->Record->ResultData->ResultItem as $element1) { 
        foreach ($element1 as $key1 => $val1) {     
            echo '- '.$val1['ElementID'].' '.$key1.'</br>';  
        }            
      }          
  }
}  

Это что я получаю:

42 ResultItem
- Status
- 43 ResultItem
- Status
- 72 ResultItem
- 100 ResultItem
70 ResultItem
- Status
- 43 ResultItem
- Status
- 72 ResultItem
- 100 ResultItem

Вот, что я ожидаю получить:

42 ResultItem
- Status
- 43 ResultItem
70 ResultItem
- Status
- 72 ResultItem
- 100 ResultItem

Где ошибка?

Как я могу различить две "Запись-> ResultData-> ResultItem "в foreach l oop, поскольку оба они имеют атрибут" ElementID "с двумя разными значениями?

1 Ответ

0 голосов
/ 07 мая 2020

Согласно предоставленной структуре xml вы можете сделать что-то вроде:

foreach ($xml->Record->ResultData as $element) { 
  foreach ($element as $key => $val) {
    echo $val['ElementID'].' '.$key.PHP_EOL;
    // iterate over children of current element `$val`
    foreach ($val as $key1 => $element1) { 
      if ($key1 === 'Status') {
        echo '- '.$key1.PHP_EOL;  
      } elseif ($key1 === 'ResultItem') {
        echo '- '.$element1['ElementID'].' '.$key1.PHP_EOL;  
      }            
    }          
  }
}
...