PHP SimpleXML - 一行解决方案查找密钥;在XML文件中找到它的父级?

时间:2012-03-07 17:55:10

标签: php xml simplexml

我的目标是:首先,在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()的短/优雅(单行?)解决方案?

请注意,这是homework,但上述问题根本不是家庭作业问题的症结所在。我完成了家庭作业,但知道上述问题的答案将有助于我使我的解决方案更加优雅。

2 个答案:

答案 0 :(得分:1)

“key”更合适的术语是“TextNode value”。您正在寻找

在您的情况下,此XPath查询将提供projectname元素

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

由于这是标记的家庭作业,我将由您自行决定必要的PHP代码。

答案 1 :(得分:1)

有一种很好的方法可以通过继承SimpleXML来获取XML节点的父节点 - 请参阅我的code here - 不是我的想法;我相信在php.net上发现它。

相关问题