2012-03-15 5 views
0

У меня есть документ XML, который я пытаюсь получить некоторые из значений и не знаю, как добраться до атрибутов. Пример структуры и значения приведены ниже:PHP Parse 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> 

Я пытаюсь получить двигатель [ «имя»] атрибут (не «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; 
} 
+0

Вы продолжаете говорить, что вы «получить ошибки», зная, что содержимое этих ошибок было бы полезно. – salathe

ответ

0

Используйте метод SimpleXMLElement::attributes получить атрибуты:

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

Примечание: Я немного изменил «путь "к элементу, начинающемуся с $xml, потому что именно так он загрузил фрагмент для меня.

+0

Я получил это, но мне нужно было получить имена атрибутов «engine», поэтому я думал, что буду делать то же самое, что и выше, но я продолжаю получать ошибки: $ 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] -> engine [0] -> engine [0] -> attributes() -> имя) –

+0

Я был на этом весь день, и я просто отправил по электронной почте компанию, с которой я загружаю XML-файл. Я отредактировал структуру данных XML выше. Я не знаю, есть ли ошибка в файле, который они мне отправили, но я пытаюсь перейти на второй узел engine-> engine. и когда первый пуст, я получаю сообщение об ошибке. Есть ли что-то, что я делаю неправильно? –

+0

В верхней части добавлен узел с именем «common_data» –

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.)

Смежные вопросы