Извлечение данных XML с помощью циклов по каждому элементу, результаты несовместимы - PullRequest
0 голосов
/ 03 июня 2019

Я извлекаю данные XML с использованием циклов DOMDocument и foreach. Я извлекаю определенные атрибуты и значения узлов из документа XML и создаю переменные с этими данными. Я тогда повторяю переменные.

Я успешно выполнил это для первой части данных XML, которая находится между тегами <VehicleDescription. Однако, используя ту же логику с данными в тегах <style>, у меня возникли проблемы. В частности, созданные переменные не будут отображаться, если они не находятся в цикле foreach. Смотрите код ниже для уточнения.

Мой php:

<?php

  $vehiclexml = $_POST['vehiclexml'];

  $xml = file_get_contents($vehiclexml);
  $dom = new DOMDocument();
  $dom->loadXML($xml);

   //This foreach loop works perfectly, the variables echo below:

  foreach ($dom->getElementsByTagName('VehicleDescription') as $vehicleDescription){
    $year = $vehicleDescription->getAttribute('modelYear');
    $make = $vehicleDescription->getAttribute('MakeName');
    $model = $vehicleDescription->getAttribute('ModelName');
    $trim = $vehicleDescription->getAttribute('StyleName');
    $id = $vehicleDescription->getAttribute('id');
    $BodyType = $vehicleDescription->getAttribute('altBodyType');
    $drivetrain = $vehicleDescription->getAttribute('drivetrain');
    }

   //This foreach loop works; however, the variables don't echo below, the will only echo within the loop tags. How can I resolve this?

  foreach ($dom->getElementsByTagName('style') as $style){
    $displacement = $style->getElementsByTagName('displacement')->item(0)->nodeValue;
    }


  echo "<b>Year:</b> ".$year;
  echo "<br>";
  echo "<b>Make:</b> ".$make;
  echo "<br>";
  echo "<b>Model:</b> ".$model;
  echo "<br>";
  echo "<b>Trim:</b> ".$trim;
  echo "<br>";
  echo "<b>Drivetrain:</b> ".$drivetrain;
  echo "<br>";

  //Displacement will not echo
  echo "<b>Displacement:</b> ".$displacement;

?>

Вот XML-файл, из которого он извлекает:

<VehicleDescription country="US" language="en" modelYear="2019" MakeName="Toyota" ModelName="RAV4" StyleName="LE" id="1111"  altBodyType="SUV" drivetrain="AWD">
  <style modelYear="2019" name="Toyota RAV4 LE" passDoors="4">
        <make>Toyota</make>
        <model>RAV4</model>
        <style>LE</style>
        <drivetrain>AWD</drivetrain>
        <displacement>2.5 liter</displacement>
        <cylinders>4-cylinder</cylinders>
        <gears>8-speed</gears>
        <transtype>automatic</transtype>
        <horsepower>203</horsepower>
        <torque>184</torque>
     </style>
</VehicleDescription>

Любая помощь или понимание того, почему переменные из первого цикла foreach отражаются, а переменные из второго не очень приветствуются.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Просто чтобы опубликовать альтернативное решение, как вы это исправили.

Поскольку у вас есть пара тегов <stlye>, это означает, что foreach попытается использоватьвсе теги стиля.Но так как вы знаете, что вы ищете только содержимое первого тега, вы можете удалить цикл foreach и использовать метод item() ...

$displacement = $dom->getElementsByTagName('style')->item(0)
        ->getElementsByTagName('displacement')->item(0)->nodeValue;

Это также относится к тому, как вы выбираетеданные из тега <VehicleDescription>.Бросьте foreach и используйте

$vehicleDescription = $dom->getElementsByTagName('VehicleDescription')->item(0);
0 голосов
/ 03 июня 2019

Ошибка была в XML-документе.

В тегах <style> был еще один набор тегов <style>. Изменение названия второго сета решило эту проблему.

...