Использование DOMDocument для извлечения значений XML - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть ответ Soap Envelope в формате XML, из которого я пытаюсь извлечь данные.Я был успешным в извлечении некоторых точек данных;Однако я борюсь с парой.До сих пор я использовал DOMDocument в дополнение к функции getElementsbyTagName().

Я пытаюсь извлечь данные <technicalSpecification>.В основном это «Ауди S4», «5-дверный универсал», «Полный привод», «Малый универсал» и «5.0».

Вот XML (note.xml):

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
 <S:Body>
  <VehicleDescription country="US" language="en" modelYear="2008" bestMakeName="Audi" bestModelName="S4" bestStyleName="5dr Avant Wgn" xmlns="urn:description7b.services.chrome.com">
     <responseStatus responseCode="Successful" description="Successful"/>
     <vinDescription vin="WAUUL78E38A092113" modelYear="2008" division="Audi" modelName="S4" styleName="5dr Avant Wgn" bodyType="Wagon 4 Dr." drivingWheels="AWD" builddata="no">
        <WorldManufacturerIdentifier>Germany Audi Nsu</WorldManufacturerIdentifier>
        <restraintTypes>
           <group id="9">Safety</group>
           <header id="38">Air Bag - Frontal</header>
           <category id="1001">Driver Air Bag</category>
        </restraintTypes>
        <restraintTypes>
           <group id="9">Safety</group>
           <header id="38">Air Bag - Frontal</header>
           <category id="1002">Passenger Air Bag</category>
        </restraintTypes>
        <restraintTypes>
           <group id="9">Safety</group>
           <header id="39">Air Bag - Side</header>
           <category id="1005">Front Side Air Bag</category>
        </restraintTypes>
        <restraintTypes>
           <group id="9">Safety</group>
           <header id="39">Air Bag - Side</header>
           <category id="1007">Front Head Air Bag</category>
        </restraintTypes>
        <restraintTypes>
           <group id="9">Safety</group>
           <header id="39">Air Bag - Side</header>
           <category id="1008">Rear Head Air Bag</category>
        </restraintTypes>
        <marketClass id="53">Small Wagon</marketClass>
     </vinDescription>
     <technicalSpecification>
        <titleId>1</titleId>
        <value value="Audi S4" condition="-PT">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
        <value value="Audi S4" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>2</titleId>
        <value value="5 Door Wagon" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>6</titleId>
        <value value="All-Wheel Drive" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>7</titleId>
        <value value="Small Station Wagon" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>8</titleId>
        <range min="5.0" max="5.0"/>
        <value value="5" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
  </VehicleDescription>

Вот мой PHP:

<html>
 <body>

  <?php

  $xml = file_get_contents('note.xml');

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


  $id = $dom->getElementsByTagName('WorldManufacturerIdentifier')->item(0);
  $vin = $dom->getElementsByTagName('titleId')->item(0);

  echo $id->textContent;
  echo "<br>";
  echo $vin->textContent;


  ?>

 </body>
</html>

Возвращает:

Germany Audi Nsu
1

Мой желаемый результат будет:

Germany Audi Nsu
Audi S4
5 Door Wagon
All-Wheel Drive
Small Station Wagon
5.0

Любые идеи о том, как я могу назвать эти technicalSpecification переменные, были бы великолепны.Большое спасибо!

___________________________________________________________________________

Я сейчас пытаюсь получить данные из раздела "Внешний цвет".Я очень близкоЯ хочу, чтобы выходные данные выглядели следующим образом:

Общее имя цвета - Техническое имя цвета
Так что-то вроде:

Красный - блестящий красный
Черный - блестящий черный

Вот XML-код для вывода цвета экстерьера:

     <exteriorColor colorCode="A2A2" colorName="Brilliant Black" rgbValue="131313">
        <genericColor name="Black" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="C8C8" colorName="Brilliant Red" rgbValue="D23637">
        <genericColor name="Red" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="8A8A" colorName="Deep Sea Blue Pearl" rgbValue="0F172A">
        <genericColor name="Blue" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="F5F5" colorName="Dolphin Gray Metallic" rgbValue="53575F">
        <genericColor name="Gray" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="T9T9" colorName="Ibis White" rgbValue="F4F5EF">
        <genericColor name="White" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="1T1T" colorName="Imola Yellow" rgbValue="FFE242">
        <genericColor name="Yellow" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="5B5B" colorName="Light Silver Metallic" rgbValue="A4A5A7">
        <genericColor name="Gray" primary="false"/>
        <genericColor name="Silver" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="L8L8" colorName="Phantom Black Pearl" rgbValue="000000">
        <genericColor name="Black" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>
     <exteriorColor colorCode="5N5N" colorName="Sprint Blue Pearl" rgbValue="1F3986">
        <genericColor name="Blue" primary="true"/>
        <styleId>292015</styleId>
        <styleId>292016</styleId>
     </exteriorColor>

Вот мой PHP до сих пор:

$finalColor = [];
foreach ($dom->getElementsByTagName('exteriorColor') as $exColor){
   $genColor = $exColor->getElementsByTagName('genericColor')->item(0)->getAttribute("name");
   $colorNames = $exColor->getAttribute("colorName");
   $finalColor = $genColor."- ".$colorNames;
 }
   print_r($finalColor);
   echo "<br>";

При этом извлекается только последний цвет, а не полный массив.Некоторое время дорабатывал безуспешно.Есть идеи?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете использовать ту же идею, что и у вас, - использовать getElementsByTagName() для извлечения списка <technicalSpecification> элементов, а затем внутри него вы можете извлечь элемент <value>.Используйте ->getAttribute("value") элемента для извлечения значения после.

foreach ( $dom->getElementsByTagName('technicalSpecification') as $techSpec )   {
    echo $techSpec->getElementsByTagName('value')->item(0)->getAttribute("value");
    echo "<br>";
}

Что выводит ...

Audi S4<br>5 Door Wagon<br>All-Wheel Drive<br>Small Station Wagon<br>5<br>

Единственное, что последнее значение - 5 ине 5.0, так как он находится не в том же поле, что и другие элементы.

Обновление:

Вы можете сохранить все эти данные, используя <titleId>значение в качестве индекса и значение, извлеченное выше, как значение против него.Так что просто создавайте массив, когда вы проходите ...

$techData = [];
foreach ( $dom->getElementsByTagName('technicalSpecification') as $techSpec )   {
    $id = $techSpec->getElementsByTagName('titleId')->item(0)->nodeValue;
    $techData [$id]= $techSpec->getElementsByTagName('value')->item(0)->getAttribute("value");
}
print_r($techData);
echo $techData[7];

, который дает вам ...

Array
(
    [1] => Audi S4
    [2] => 5 Door Wagon
    [6] => All-Wheel Drive
    [7] => Small Station Wagon
    [8] => 5
)
Small Station Wagon

Вы можете использовать XPath, чтобы сделать то же самое, но если вы используетебольше чем 1 поле, вероятно, это проще сделать (ИМХО).

...