SimpleXML больше тегов в 1 элементе - PullRequest
2 голосов
/ 16 июля 2009

Эй, ребята, я хочу разобрать некоторые xml, но я не знаю, как получить те же теги из одного элемента.

Я хочу разобрать это:

<profile>
   <name>john</name>
   <lang>english</lang>
   <lang>dutch</lang>
</profile>

Итак, я хочу разобрать языки, на которых говорит Джон. как я могу это сделать?

Ответы [ 4 ]

2 голосов
/ 16 июля 2009

Вы можете запустить цикл foreach над узлом элемента после того, как вы подключили его с помощью SimpleXML, например:

$xml_profiles = simplexml_load_file($file_profiles);

foreach($xml_profiles->profile as $profile)
{   //-- first foreach pulls out each profile node

    foreach($profile->lang as $lang_spoken)
    {   //-- will pull out each lang node into a variable called $lang_spoken
        echo $lang_spoken;
    }
}

Преимущество заключается в возможности обрабатывать любое количество элементов lang, которые вы можете иметь или не иметь для каждого элемента профиля.

2 голосов
/ 16 июля 2009
$profile->lang[0]
$profile->lang[1]
1 голос
/ 16 июля 2009

Представьте, что дубликаты узлов XML ведут себя как массив.

Как уже отмечали другие, вы можете получить доступ к дочерним узлам с помощью синтаксиса скобок

myXML->childNode[childIndex]

В качестве примечания, это то, как работают RSS-каналы. Вы заметите несколько

<item>
</item>

<item>
</item>

<item>
</item>

Теги внутри тега RSS XML. Читатели RSS ежедневно решают эту проблему, рассматривая список как массив элементов.

Который можно зациклить.

0 голосов
/ 16 июля 2009

Вы также можете использовать XPath для сбора массива определенных элементов, таких как

$xProfile = simplexml_load_string("<profile>...</profile>");
$sName = 'john';
$aLang = $xProfile->xpath("/profile/name[text()='".$sName."']/lang");
// Now $aLang will be an array of lang *nodes* (2 for John). Because they
// are nodes you can still do SimpleXML "stuff" with them i.e.
// $aLang[0]->attributes(); --which is an empty object
// or even

$sPerson = (string)$aLang[0]->xpath('preceding-sibling::name');
// of course you already know this... but this was just to show what you can do
// with the SimpleXml node.
...