在PHP中处理提取的XML字符串数据

时间:2018-10-17 15:25:52

标签: php string if-statement foreach domdocument

我正在从Vehicle VIN解码器提取和处理数据。输入车的VIN并返回有关该车规格的数据即可。

我在引擎数据方面遇到了一些麻烦。每个数据点都与一个ID相关联,我使用foreach循环将其提取。发动机排量与$techData[42]有关,其中VIN: WAUUL78E38A092113 $techData[42]= "4.2L/254"的位置。我只关心"4.2L"的值。如何仅提取4.2L并创建一个变量,然后echo?我需要这些额外的代码来灵活使用,并且适用于我输入的任何VIN。 techData[42]等于或等于4.2L,5L,5.5L等。关于我如何实现这一目标的任何想法将不胜感激。谢谢!

这是我的PHP,它返回所有$techData[]

<?php
 $xml = file_get_contents('note.xml');
 $dom = new DOMDocument();
 $dom->loadXML($xml);

 foreach ( $dom->getElementsByTagName('technicalSpecification') as $techSpecElement )   {
   foreach($techSpecElement->getElementsByTagName('value') as $valueElement) {
       foreach($valueElement->getElementsByTagName('styleId') as $styleIdElement) {
           // check the value of the styleId here
           if (in_array($styleIdElement->nodeValue, [$variable2])) {
               // if it matches, get the parent value element's value
               $id = $techSpecElement->getElementsByTagName('titleId')->item(0)->nodeValue;
               $techData[$id] = $valueElement->getAttribute("value");
           }
       }
   }
}

echo "<b>Displacement:</b> ".$techData[42]."<br>";

?>

这是我要从以下位置提取位移数据的XML:

<technicalSpecification>
 <titleId>42</titleId>
  <value value="4.2L/254" condition="">
   <styleId>292015</styleId>
   <styleId>292016</styleId>
  </value>
</technicalSpecification>

1 个答案:

答案 0 :(得分:1)

由于您不确定它是否带有/,我只是根据L对其进行了拆分。因此,这只是将第一部分(加上L)作为结果。

我已将其更改为使用XPath,尽管它看起来可能很复杂,但这只是将其分解为单独步骤的一种情况...

$dom = new DOMDocument();
$dom->load("note.xml");
$xp = new DOMXPath($dom);

$id = "42";
$styleID = "292015";

$nodes = $xp->evaluate("//technicalSpecification[titleId='$id']/value[styleId='$styleID']/@value");
$displacement = explode("L", $nodes->item(0)->nodeValue);
echo $displacement[0]."L";

表达式//technicalSpecification[titleId='$id']/value[styleId='$styleID']/@value基本上使用各种条件(即$id)来缩小您感兴趣的元素,与$styleID(可能是$variable2)相同。最终结果是来自匹配元素的value属性的列表。这就是为什么它随后使用$nodes->item(0)->nodeValue获取第一项的原因。

更新

对于您当前的逻辑,您将需要...

echo "<b>Displacement:</b> ".explode("L", $techData[42])."L<br>";