【问题标题】:Manipulating extracted XML string data in PHP在 PHP 中操作提取的 XML 字符串数据
【发布时间】:2019-03-22 08:16:30
【问题描述】:

我正在从车辆 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>

【问题讨论】:

  • 它总是有那个正斜杠吗?如果是这样,您始终可以explode() 该变量并使用第一个值,例如:explode("/",$techData[42])[0]);
  • 您能否提供一个 XML 示例,因为依赖于特定 VIN 的位置 42 之类的东西并不能满足您的需求(我认为)。
  • @zack6849 我需要与我的数据提供者核实它是否总是有正斜杠。我想假设不只是为了安全,但我可能是错的。
  • @nigelren 我编辑了问题以包含我从中提取的 XML 的摘录。所有位移数据将始终具有&lt;titleId&gt;42&lt;/titleId&gt;
  • $variable2 是什么?

标签: php string if-statement foreach domdocument


【解决方案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-&gt;item(0)-&gt;nodeValue 来获取第一项。

更新:

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

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

【讨论】:

  • 如果我想保留我当前的逻辑而不是切换到DOMXPath,它会看起来像:$displacement = explode("L", $techData[42]);,然后是echo $displacement[0];
  • 您是否说切换到DOMXPath 会比我当前使用foreach 循环提取数据的应用程序逻辑更有利?
  • XPath 有时并不那么容易,但如果您打算使用 XML,最好开始学习它。从代码中可以看出,它要短得多,您可以使用它进行一些快速搜索。
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 2011-08-09
  • 2012-07-06
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多