2012-03-15 225 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「引擎」)。我想下面的工作,但我得到的錯誤(我不能解析過去的「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 2012-03-15 20:09:44

回答

0

使用SimpleXMLElement::attributes方法來獲得屬性:

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

注:我稍微改「路徑「從$xml開始的元素,因爲這是它爲我加載片段的方式。

+0

我明白了,但我需要做的是獲得「引擎」的屬性名稱,所以我想我會做同樣的,但我不斷收到錯誤:$ xml-> available_vehicle_styles-> vehicle_style-> engines->引擎作爲$ b – 2012-03-15 19:41:04

-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() - >姓名) – 2012-03-15 20:24:39

+0

我一直在這一整天,我只是通過電子郵件發送公司,我正在下載XML文件。我編輯了上面的XML數據的結構。我不知道他們發給我的文件中是否有錯誤,但我試圖找到第二個引擎 - >引擎節點。當第一個是空的時候,我得到一個錯誤。有什麼我做錯了嗎? – 2012-03-15 21:02:47

+0

在頂部有一個節點添加了名爲「common_data」 – 2012-03-15 21:04:44

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