Xpath и условный выбор потомков на основе значения элемента предков - PullRequest
2 голосов
/ 03 мая 2011

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

Я довольно новичок в разборе XML, поэтому разбираю XML, и до сих пор я имел дело только с довольно простым анализом.

В настоящее время я застрял со следующей проблемой ...

У меня есть XML с этой структурой: -

    <members>
        <member>
            <name>David Smith</name>
            <information>
                <description>home telephone</description>
                <given_information>
                    <details>0123465987</details>
                </given_information>
            </information>
            <information>
                <description>mobile telephone</description>
                <given_information>
                    <details>056142856987</details>
                </given_information>
            </information>
            <information>
                <description>email address</description>
                <given_information>
                    <details>d.smith@yahoo.com</details>
                </given_information>
            </information>
        </member>
    </members> 

Я использую simplexml & xpath так: -

    $XML_load =  simplexml_load_file('members.xml');
    foreach ($XML_load->members->xpath('//member') as $member)
    {
    $member_name = $member->name;
    } 

У меня проблема в том, что я не знаю, как получить переменную из элемента на основе элемента. Поэтому мне нужно иметь возможность создавать переменные $ mobile_number, $ home_number и $ email_address точно на основе информации, содержащейся в элементе предка.

Может кто-нибудь помочь мне с этим? Любой совет будет принята с благодарностью.

Я надеюсь, что объяснил проблему достаточно хорошо, и моя терминология верна, но, пожалуйста, простите меня, если это не так, поскольку я все еще новичок в этом.

Кстати, как использовать Simplexml / XPath как это лучший способ сделать это? Я слышал, что xmlDOM лучше, но, похоже, я не могу найти какие-либо ресурсы, связанные с тем, что помогло бы мне с вышеуказанной проблемой.

Заранее спасибо!

1 Ответ

3 голосов
/ 03 мая 2011

Попробуйте для начала:

<?php
$dom = new DOMDocument();
$dom->load('yourXmlFile.xml');

/*$dom->loadXml('<members>
    <member>
        <name>David Smith</name>
        <information>
            <description>home telephone</description>
            <given_information>
                <details>0123465987</details>
            </given_information>
        </information>

        <information>
            <description>mobile telephone</description>
            <given_information>
                <details>056142856987</details>
            </given_information>
        </information>

        <information>
            <description>email address</description>
            <given_information>
                <details>d.smith@yahoo.com</details>
            </given_information>
        </information>
    </member>
</members>');*/

$xpath = new DOMXPath($dom);

$members = array();
foreach ($xpath->query('//member') as $memberNode) {
    $nameNode = $xpath->query('name', $memberNode);
    if ($nameNode->length > 0) {
        $name = $nameNode->item(0)->nodeValue;
        $members[$name] = array();

        foreach ($xpath->query('information', $memberNode) as $informationNode) {
            $descriptionNode = $xpath->query('description', $informationNode);
            $givenInformationDetailsNode = $xpath->query('given_information/details', $informationNode);

            if ($descriptionNode->length > 0 && $givenInformationDetailsNode->length > 0) {
                $members[$name][$descriptionNode->item(0)->nodeValue] = $givenInformationDetailsNode->item(0)->nodeValue;
            }
        }
    }
} 

var_dump($members);
...