2012-03-15 7 views
0

私はいくつかの値を取得しようとしているXML文書を持っており、属性へのアクセス方法はわかりません。構造と値の例は以下の通りです:PHPで属性付き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> 

私はエンジン[「名前」]属性(NOT「エンジン」)取得しようとしています。

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

注:私は、次の属性を取得するには(私は過去の「vehicle_style」パースカント)が、私はエラーが取得

$xml = simplexml_load_file($fileVIN); 

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

はあなたが参考になるこれらのエラーの内容を知って、「エラーが出る」と言っておきます。 – salathe

答えて

0

使用SimpleXMLElement::attributes方法を働くだろうと思った私は少し「パスを変更しました"という要素を$xmlから始めるので、それが私のためにフラグメントをロードする方法です。

+0

私はそれを得ましたが、私がする必要があったのは、 "エンジン"の属性名を取得することでしたので、上記と同じことをすると思いましたが、エラーが続いています:$ xml-> available_vehicle_styles-> vehicle_style-> engines->エンジンを$ bとして –

-1

このレイアウトでは、エンジンブロックごとに複数のエンジンが存在する可能性があるため、最初に明示的に選択する必要があります。 (一つだけがあるように起こっていることを確認するために知っていると仮定。)

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

上記のコードを試してエラーが発生しました...もし私が次のようにすれば、それはうまく印刷されます...($ xml-> vin_number-> available_vehicle_styles-> vehicle_style [0] - > attributes() - >私は次のように試してみましたが、まだエラーがありました...($ xml-> vin_number-> available_vehicle_styles-> vehicle_style [0] - > engines [0] - > engine [0] - > attributes()名前: –

+0

私は一日中この記事を書いています。私はXMLファイルをダウンロードしていることを会社にメールしました。上記のXMLデータの構造を編集しました。彼らが私に送ったファイルにエラーがあるかどうかはわかりませんが、私は2番目のエンジン - >エンジンノードに到達しようとしています。最初のものが空のときはエラーになります。私が間違っていることがありますか? –

+0

上部に「common_data」という名前のノードが追加されています –

1

あなたのXMLを同じに構成されていると仮定this example XMLとしては、次の2つのスニペットは、エンジン名を取得しますでした。

プロパティ階層の方法(複数の行に分かれて読むことができます)。

$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。)