PHP使用属性解析XML

时间:2012-03-15 19:25:33

标签: php xml

我有一个XML文档,我试图获取一些值,但不知道如何获取属性。结构和值的示例如下:

<vin_number value="3N1AB51D84L729887">

  <common_data>

    <engines>

    </engines>

  </common_data>

  <available_vehicle_styles>

    <vehicle_style name="SE-R 4dr Sedan" style_id="100285116" complete="Y">

      <engines>

        <engine brand="" name="ED 2L NA I 4 double overhead cam (DOHC) 16V"></engine>

      </engines>

    </vehicle_style>

  </available_vehicle_styles>

</vin_number>

我正在尝试获取引擎[“name”]属性(不是“ENGINES”)。我认为以下内容可行,但我收到错误(我无法解析过“vehicle_style”)

$xml = simplexml_load_file($fileVIN);

foreach($xml->vin_number->available_vehicle_styles->vehicle_style->engines->engine->attributes() as $a => $b) {
    echo $b;
}

3 个答案:

答案 0 :(得分:1)

假设您的XML结构与this example XML相同,以下两个代码段将获取引擎名称。

属性层次结构方式(拆分为多行,以便您可以读取它)。

$name = (string) $xml->vin_number
                     ->available_vehicle_styles
                     ->vehicle_style
                     ->engines
                     ->engine['name'];

或者更简洁的XPath方式。

$engines = $xml->xpath('//engines/engine');
$name = (string) $engines[0]['name'];

除非您的XML中有多个引擎名称,否则根本不需要使用foreach循环。

See both snippets running on a codepad。)

答案 1 :(得分:0)

使用SimpleXMLElement::attributes方法获取属性:

foreach($xml->available_vehicle_styles->vehicle_style as $b) {
    $attrs = $b->attributes();
    echo "Name = $attrs->name";
}

注意:我稍微改变了从$xml开始的元素的“路径”,因为这就是它为我加载片段的方式。

答案 2 :(得分:-1)

通过这种布局,每个引擎块可能有多个引擎,因此您必须明确选择第一个引擎。 (假设你肯定知道只会有一个。)

$name = $xml->available_vehicle_styles->vehicle_style->engines->engine[0]->attributes()->name;