2013-06-06 2 views
2

У меня есть что-то вроде этого:атрибуты доступа из узла XML с пространством имен в PHP

$x = simplexml_load_file('myxml.xml'); 

[...] 

foreach($x->y->z[0]->w->k as $k){ 
    [...] 
} 

Мой файл XML является чем-то вроде:

<x> 
    <y> 
    <z> 
     <w> 
     <k prefix:name="value"> 
      [...] 
     </k> 
     </w> 
     [...] 
    </z> 
    [...] 
    </y> 
    [...] 
</x> 

Теперь я хотел бы получить доступ к атрибуту мой элемент k. У меня есть красный, что я могу получить к нему доступ, используя мой ineach:

$k['prefix:name'] 

Но это не работает. Что я делаю неправильно?

Я добавил поддельный атрибут к моему K элементу, и она работала, я думаю, что проблема в том, что атрибут я пытаюсь получить доступ в другом пространстве имен:

<k xsi:type="value"> 
[...] 
</k> 
+0

Взгляните на это: http://www.php.net/manual/en/class.simplexmliterator.php, есть 'getChildren()'. –

+0

Возможный дубликат [Как получить атрибут узла с пространством имен с помощью SimpleXML?] (Http://stackoverflow.com/questions/6576773/how-to-get-attribute-of-node-with-namespace-using-simplexml) - Вы получаете доступ к атрибуту узла в другом пространстве имен. – hakre

ответ

5

Я решил, я нашел решение в http://bytes.com/topic/php/answers/798486-simplexml-how-get-attributes-namespace-xml-vs-preg_

foreach($x->y->z[0]->w->k as $k){     
    $namespaces = $k->getNameSpaces(true);     
    $xsi = $k->attributes($namespaces['xsi']); 

    echo $xsi['type']; 
} 

getNameSpaces(true) функции возвращает пространство имен документа XML, то я выбираю один я ищу (xsi) и доступ к атрибуту, мне нужно, как если атрибуты есть из пространств имен, и не узла $ k. Я хочу, чтобы это помогло кому-то другому.

+4

Вместо использования 'getNamespaces' вы можете передать атрибуты' - true' в '-> attributes()': 'echo $ k-> ('xsi', true) -> type'. – IMSoP

+0

Решение IMSoP отлично работает! И это более прямо, чем мое, полностью окончательное решение. – Federinik

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