PHP SimpleXML - однострочный поиск ключа; найти своего родителя в файле XML? - PullRequest
2 голосов
/ 07 марта 2012

Моя цель: во-первых, найти определенный ключ в файле XML.Во-вторых, вернуть родительский ключ.В приведенном ниже примере кода ключ является именем файла.

Код:

<?php
    $inputXML = simplexml_load_file("data.xml");

    $myProject = lookupProject($inputXML, "file1");
    echo $myProject->projectname; //print the name of the project containing <filename>"file1"</filename>
    echo "\n";

    /*
     Goal: return the <project> that is the parent of <filename>$input_filename</filename>
     Assume: a <filename> appears in at most one <project> subtree.
     */
    function lookupProject($myXML, $input_filename)  
    {
        foreach($myXML->project as $curr_project) //notice I don't mention the root <projects></projects>
        {
            foreach($curr_project->filename as $curr_filename)
            {
                if ($curr_filename == $input_filename) 
                {
                    return $curr_project; 
                }
            }
        }
        return null; //if not found, return null
    }  
?>

Пример файла данных, data.xml

<projects>
    <project>
        <projectname>project1</projectname>
        <filename>file1</filename>
        <filename>file2</filename>
    </project>
    <project>
        <projectname>project2</projectname>
        <filename>file3</filename>
    </project>
</projects>

Если у нас есть болеесложная структура XML со многими уровнями поддеревьев, для поиска родителя файла file1 может потребоваться множество циклов foreach ().Есть ли команда SimpleXML, которая абстрагирует циклы, которые появляются в lookupProject?

tl; dr Существует ли короткое / элегантное (однострочное) решение, которое реализует lookupProject ()?

Обратите внимание, что это домашняя работа , но вопрос вышеэто вовсе не суть проблемы с домашним заданием.Я выполнил домашнее задание, но знание ответа на поставленный выше вопрос помогло бы мне сделать свое решение более элегантным.

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Есть хороший способ получить родительский элемент узла XML с помощью подкласса SimpleXML - см. Мой код здесь - хотя и не моя идея; Я нашел это на php.net, я полагаю.

1 голос
/ 07 марта 2012

Более подходящим термином для «ключа» будет «Значение TextNode».Вы ищете

В вашем случае это XPath запроспередаст элемент имени проекта

/projects/project[filename="file1"]/projectname

Поскольку это домашнее задание с тегами, я оставлю вам возможность выяснить необходимый код PHP.

...