2013-04-17 2 views
1

У меня есть вопрос, и ответ прост, но мне просто не хватает понимания с моей стороны.Доступ ко всем дочерним элементам определенного узла с помощью simplexml и php

У меня есть XML-файл с следующий вид (короткий пример)

<item id="1234"> 
    <property name="country_id"> 
     <value>4402</value> 
    </property> 
    <property name="rc_maintenance_other"> 
    </property> 
    <property name="claim_right_shareholder"> 
    </property> 
    <property name="charges_other"> 
    </property> 
    <property name="other_expenses_heating"> 
    </property> 
    <property name="unpaid_bills_amount"> 
    </property> 
    <property name="iv_person_phone"> 
     <value>03-6756711</value> 
    </property> 
</item> 
<item id="9876"> 
    ... 
</item> 

Моя проблема, я хочу, чтобы прочитать все propertys от одного элемента с идентификатором 1234 с их атрибута и их значение, если существует , в массиве.

Я знаю, как получить доступ к определенному элементу с помощью xpath. (Благодаря этому замечательному сообществу stackoverflow :))

Но как я могу использовать функцию children() только для определенного элемента?

Как это

foreach ($item[id="1234"]->children() as $property) { 

Спасибо так много!

+0

Сначала написать код, как получить доступ к * элемент * элемент, который вы хотите детей из. Храните его в переменной. Вызовите метод children() на нем. Как вы написали, вы знаете, как работает первая часть, и вы знаете о методе children(), поэтому в основном это только объединение этих двух. – hakre

+0

Возможный дубликат [SimpleXML получить содержимое элемента на основе значения атрибута] (http://stackoverflow.com/questions/4736417/simplexml-get-element-content-based-on-attribute-value) – hakre

+0

Но я, возможно, не понимаю ваших вопрос полностью, возможно, пролить некоторый свет. Вы хотите получить всех потомков? – hakre

ответ

4

Я надеюсь, что это может помочь вам.

Код

$xml = new SimpleXMLElement('<item id="1234"> 
    <property name="country_id"> 
     <value>4402</value> 
    </property> 
    <property name="rc_maintenance_other"> 
    </property> 
    <property name="claim_right_shareholder"> 
    </property> 
    <property name="charges_other"> 
    </property> 
    <property name="other_expenses_heating"> 
    </property> 
    <property name="unpaid_bills_amount"> 
    </property> 
    <property name="iv_person_phone"> 
     <value>03-6756711</value> 
    </property> 
</item>'); 

foreach ($xml->xpath('//item[@id="1234"]') as $item) 
{  
    foreach ($item->children() as $child) { 
     echo $child['name'] ."\n"; 
    } 
} 

Выход

country_id 
rc_maintenance_other 
claim_right_shareholder 
charges_other 
other_expenses_heating 
unpaid_bills_amount 
iv_person_phone 

Пример: http://sandbox.onlinephpfunctions.com/code/4e0ddba2ed273ab4a20dc9379ea9ed0d669a4c0d

+0

Спасибо, что это работает нормально! Я знал, что это просто, но мой мозг просто не хотел выводить его.Я генерирую путь до переменной $ id и вызываю его так: 'foreach ($ xml-> xpath ($ path) как $ item)' – Owl

+0

И в этом случае кому-то еще это нужно, здесь, как получить доступ к значениям также: \t '$ path = '//item[@id="'.$id.'"] '; \t Еогеасп ($ xml-> XPath ($ путь), как $ п) { \t \t Еогеасп ($ item-> дети() как $ ребенка) { \t \t \t Еогеасп ($ ляющих> дети(), как $ значение) { \t \t \t \t echo $ child ['name']. "=". $ value. "
"; \t \t \t} \t \t} \t} ' – Owl

0

Но как я могу использовать функцию children() только для определенного элемента?

Метод SimpleXMLElement::children()Docs используется всегда к определенному элементу в SimpleXML. Таким образом, вы можете сделать это, просто используя его.

$element->children(); 

Ручные монеты это следующим образом:

Находит детей данного узла

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