2013-05-17 5 views
-2

У меня проблема с получением определенного имени из xml-файла с использованием xpath. Вот XML код:Xpath-запрос для xml-файла

<Zones> 
<Zone ID="AFI" Quantity="67" Length="140" Open="0"> 
    <Name LngID="IT">Name 1</Name> 
    <Name LngID="EN">Name 2</Name> 
    <Name LngID="DE">Name 3</Name> 
</Zone> 
<Zone ID="SLE" Quantity="1" Length="2" Open="0"> 
    <Name LngID="IT">Name 4</Name> 
    <Name LngID="EN">Name 5</Name> 
    <Name LngID="DE">Name 6</Name> 
</Zone> 
</Zones> 

А вот мой PHP код:

foreach($area->Zones->Zone as $zone) { 

    $ZONE_ID = $zone['ID']; 
    $zone_lang = $zone->xpath("/Name[@LngID='EN']"); 
    $ZONE_NAME = var_dum($zone_lang); 

    echo $ZONE_ID; 
    echo " - "; 
    echo $ZONE_NAME; 

}

мне нужно только EN имя Name элемента (Name LngID = "EN" -> Имя 2 и Name 5), но этот код не работал (я получаю значение Array).

Любое предложение? Спасибо, совет!

+0

'var_dum ($ zone_lang);' & проверить, что вы получаете там причина XPath возвращает массив. поэтому вам нужно '$ zone_lang [0]'. – Rikesh

+0

Да, 'xpath' возвращает массив (даже если есть только один элемент). 'xpath (...) [0]' относится к первому совпадающему элементу. – Passerby

+0

Я получаю пустую страницу – Adrian

ответ

0

Попробуйте это:

$zone_lang = (string)array_pop($zone->xpath('Name[@LngID="EN"]')); 
+1

Мне нравится это использование array_pop() +1 – michi

+0

Вот что я ищу :) Спасибо Silkfire – Adrian

+0

Просто используйте '[0]', это первая запись. И array_pop * неверен *, потому что здесь вы не используете переменную. Этот код дает NOTICES = Bad Practice, пожалуйста, не предлагайте Stackoverflow (по крайней мере, не как * единственный способ пойти *) (читайте: помещайте предупреждение, показывайте лучший код вперед и т. Д.). – hakre

1

Ваше выражение xpath неправильно, не / до того Name:

$xml = simplexml_load_string($x); // assuming XML in $x 
foreach($xml->Zone as $zone) 
    echo "$zone[ID] - " . $zone->xpath("Name[@LngID='EN']")[0] . "<br />"; 

видеть, что это работает: http://codepad.viper-7.com/dHSKPT

Редактировать благодаря Silkfire: PHP < 5.4 сделать:

foreach($xml->Zone as $zone) { 

$name = $zone->xpath("Name[@LngID='EN']"); 
echo "$zone[ID] - $name[0]<br />"; 
} 

видеть работающий в PHP 5.2.17: http://codepad.viper-7.com/nHVrmV

Или с list:

foreach($xml->Zone as $zone) { 

list($name) = $zone->xpath("Name[@LngID='EN']"); 
echo "$zone[ID] - $name<br />"; 
} 
+0

. Реферирование массива работает только с 5.4+, OP может работать под версией ниже. – silkfire

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