【问题标题】:Extracting XML Data with DOMDocument Based on Id's基于 Id 的 DOMDocument 提取 XML 数据
【发布时间】:2019-03-08 00:10:35
【问题描述】:

我正在使用 DOMDocumentforeach 循环从 XML 文档中提取数据。数据来自 VIN 解码器。输入车辆的 VIN,然后您将获得有关它的数据。

我正在努力解决的问题是 VIN 解码器返回的车辆数据是由该车辆的风格分割的。例如,奥迪 S4 的 VIN 会返回两种样式:5dr Avant Wgn Man5dr Avant Wgn Auto。每种样式都有一个 ID,应用于该样式的数据也带有该 ID。

以下是这两种样式的 ID 结构:
5dr Avant Wgn Man - ID: 292015
5dr Avant Wgn Auto - ID: 292016

以及数据如何与这些 ID 相关联的示例:

    <technicalSpecification>
        <titleId>2</titleId>
        <value value="5 Door Wagon" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>

请注意,5 门旅行车适用于两种款式。

我想要实现的是,当我选择5dr Avant Wgn Man 时,将显示与该样式相关的所有&lt;technicalSpecification&gt; 数据。同样,如果选择了5dr Avant Wgn Auto,则将显示与该样式相关的所有数据。

这是 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"/>

     <style id="292015" modelYear="2008" name="5dr Avant Wgn Man" nameWoTrim="5dr Avant Wgn Man" mfrModelCode="8ED549" fleetOnly="false" modelFleet="false" passDoors="4" altBodyType="Station Wagon" drivetrain="All Wheel Drive">
        <division id="4">Audi</division>
        <subdivision id="5020">Audi</subdivision>
        <model id="17308">S4</model>
        <basePrice unknown="false" invoice="46137.0" msrp="49610.0" destination="775.0"/>
        <bodyType primary="true" id="7">Station Wagon</bodyType>
        <marketClass id="53">Small Wagon</marketClass>
        <acode>USB80AUC085A0</acode>
     </style>
     <style id="292016" modelYear="2008" name="5dr Avant Wgn Auto" nameWoTrim="5dr Avant Wgn Auto" mfrModelCode="8ED54L" fleetOnly="false" modelFleet="false" passDoors="4" altBodyType="Station Wagon" drivetrain="All Wheel Drive">
        <division id="4">Audi</division>
        <subdivision id="5020">Audi</subdivision>
        <model id="17308">S4</model>
        <basePrice unknown="false" invoice="47162.0" msrp="50710.0" destination="775.0"/>
        <bodyType primary="true" id="7">Station Wagon</bodyType>
        <marketClass id="53">Small Wagon</marketClass>
        <acode>USB80AUC085A1</acode>
     </style>
     <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>
     <technicalSpecification>
        <titleId>9</titleId>
        <range min="90.8" max="90.8"/>
        <value value="90.8" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>10</titleId>
        <range min="4012.0" max="4101.0"/>
        <value value="4012" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="4101" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>26</titleId>
        <range min="13.0" max="14.0"/>
        <value value="13" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="14" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>27</titleId>
        <range min="20.0" max="21.0"/>
        <value value="20" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="21" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>31</titleId>
        <value value="- TBD -" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>32</titleId>
        <value value="- TBD -" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>33</titleId>
        <value value="- TBD -" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>34</titleId>
        <value value="- TBD -" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>40</titleId>
        <value value="" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>41</titleId>
        <value value="Gas V8" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>42</titleId>
        <value value="4.2L/254" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>43</titleId>
        <value value="SEFI" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>48</titleId>
        <value value="340 @ 6800" condition="">
           <styleId>292016</styleId>
        </value>
        <value value="340 @ 7000" condition="">
           <styleId>292015</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>49</titleId>
        <value value="302 @ 3500" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>51</titleId>
        <value value="" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>52</titleId>
        <range min="6.0" max="6.0"/>
        <value value="6" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>53</titleId>
        <value value="Manual" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="Automatic" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>54</titleId>
        <value value="" condition="">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>56</titleId>
        <range min="3.67" max="4.17"/>
        <value value="3.67" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="4.17" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>57</titleId>
        <range min="2.05" max="2.34"/>
        <value value="2.05" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="2.34" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>58</titleId>
        <range min="1.46" max="1.52"/>
        <value value="1.46" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="1.52" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>59</titleId>
        <range min="1.13" max="1.14"/>
        <value value="1.13" condition="">
           <styleId>292015</styleId>
        </value>
        <value value="1.14" condition="">
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
  </VehicleDescription>

还有我的 PHP。此 PHP 将两种样式类型放入下拉列表中并打印 &lt;technicalSpecification&gt;'s。我只需要 &lt;techhnicalSpecification&gt; 根据下拉列表中选择的 style 进行更改。

<html>
 <body>

  <?php

   $xml = file_get_contents('data.xml');
   $dom = new DOMDocument();
   $dom->loadXML($xml);

  ?>

  <form>
   <select>
    <option selected="selected">Choose style</option>
   <?php
    foreach ($dom->getElementsByTagName('style') as $styleName){
      $styleType = $styleName->getAttribute("name");
      $styleArray[] = $styleType;
     }
    foreach ($styleArray as $style){
     ?>
     <option><?php echo $style;?> </option>
    <?php
     }
    ?>
    </select>
   </form>

   <br>

    <?php

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

    echo "<br><br>";
    print_r($techData);
   ?>

  </body>
 </html>

非常感谢!为您的帮助!

【问题讨论】:

    标签: php arrays xml foreach domdocument


    【解决方案1】:

    这是 SOAP(不仅仅是 XML),所以您应该尝试使用 PHP SOAP 库。但是,如果您想将其解析为 XML,请查看 DOMXpath::evaluate()。它允许您使用 Xpath 表达式来获取节点(想想 SQL,但对于 XML DOM)。可以根据属性值选择元素节点:

    $xpath = new DOMXpath($document);
    foreach ($xpath->evaluate('//technicalSpecification[value/@value="5dr Avant Wgn Man"]') as $specNode) {
       ...
    }
    

    【讨论】:

    • 我已经使用了上面的逻辑和你在这里提出的逻辑来选择元素/数据。我真正想要的是如何根据下拉选择过滤数据。如果我选择一种样式,我希望显示带有该样式标签的所有数据。有关该问题的更深入解释,请参见上文。
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多