使用Foreach循环提取XML数据,结果不一致

时间:2019-06-03 02:02:17

标签: php xml foreach domdocument

我正在使用DOMDocumentforeach循环提取XML数据。我正在从XML文档中提取某些属性和节点值,并使用该数据创建变量。然后,我回显变量。

我已经成功完成了<VehicleDescription标签之间的XML数据的第一部分的操作。但是,对<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 :(得分:0)

错误出在XML文档中。

<style>标签内是另一组<style>标签。更改第二组的名称可以解决此问题。

答案 1 :(得分:0)

只需为您解决此问题的方式发布替代解决方案。

如前所述,有两个<stlye>标签,这意味着foreach将尝试使用所有样式标签。但是,您知道自己只关注第一个标记的内容,因此可以删除foreach循环并使用item()方法...

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

这也适用于您如何从<VehicleDescription>标记中获取数据。放下foreach并使用

$vehicleDescription = $dom->getElementsByTagName('VehicleDescription')->item(0);