Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP递归查找xml子标记,同时跟踪父标记_Php_Xml_Recursion - Fatal编程技术网

使用PHP递归查找xml子标记,同时跟踪父标记

使用PHP递归查找xml子标记,同时跟踪父标记,php,xml,recursion,Php,Xml,Recursion,首先,我会在前言中说,我只是在学习这些知识,所以我可能不会使用正确的术语 下面是我需要解析的XML的一个极其简化的版本: <MyXML> <Project> <ProjectName>MyProject</ProjectName> <ProjectType>Construction</ProjectType> </Project> <Folder&g

首先,我会在前言中说,我只是在学习这些知识,所以我可能不会使用正确的术语

下面是我需要解析的XML的一个极其简化的版本:

 <MyXML>
    <Project>
        <ProjectName>MyProject</ProjectName>
        <ProjectType>Construction</ProjectType>
    </Project>
    <Folder>
        <folderid>0</folderid>
        <name>Root</name>
        <Depth></Depth>
        <Folder>
            <folderid>43943</folderid>
            <name>Construction Drawings</name>
            <ParentEntityID>0</ParentEntityID>
            <Folder>
                <folderid>43944</folderid>
                <name>Architectural</name>
                <ParentEntityID>43943</ParentEntityID>
                <Folder>
                    <folderid>43952</folderid>
                    <name>AutoCAD</name>
                    <ParentEntityID>43944</ParentEntityID>
                    <File>
                        <folderid>43952</folderid>
                        <filename>error.doc</filename>
                    </File>
                    <File>
                        <folderid>43952</folderid>
                        <filename>sb124a-map.jpg</filename>
                    </File>
                </Folder>
            </Folder>
        </Folder>
        <Folder>
            <folderid>43975</folderid>
            <name>Bid Management</name>
            <ParentEntityID>0</ParentEntityID>
            <File>
                <folderid>43975</folderid>
                <filename>ION Invoice 182 2013-04-09A.pdf</filename>
            </File>
            <Folder>
                <folderid>99999</folderid>
                <name>Temp</name>
                <ParentEntityID>43975</ParentEntityID>
                <File>
                    <folderid>99999</folderid>
                    <filename>ION Invoice 182 2013-04-09B.pdf</filename>
                </File>
            </Folder>
        </Folder>
    </Folder>
</MyXML>
我可以找出如何捕获ProjectName和ProjectType,因为该结构始终是已知的和静态的。我觉得我需要某种递归来处理文件夹/文件部分的易变性,但我真的很挣扎


在数千行长的真正的XML中,甚至文件元素都有子元素,我需要在这些子元素中捕获数据,但是我想如果我能够理解如何处理这个简化的XML,那么我应该能够解决其余的问题。我希望如此。谢谢。

你说得对,递归是获得此结果的最佳方法

<?php

function indepth($path, $current_folder)
{
    global $project_name, $project_type;
    $path[] = $current_folder->name;    
    foreach ($current_folder->File as $file) {
        echo $project_name . ',' . $project_type . ',' . implode('/', $path) . ', ' . $file->filename . "\n";
    }
    foreach ($current_folder->Folder as $folder) {
        indepth($path, $folder);
    }
}

$myxml = simplexml_load_file('test.xml');
$project_name = $myxml->Project->ProjectName;
$project_type = $myxml->Project->ProjectType;

foreach ($myxml->Folder as $folder) {
    indepth(array(), $folder);
}

请容忍我。那么foreach($myxml->folderas$Folder)将解析顶层的每个文件夹?是否使用包含XML中当前“位置”的$folder?然后,indepth函数查找当前级别的文件,然后查找当前级别的文件夹。当它找到一个时,它会再次运行该函数,查找文件,查找更多文件夹,向下搜索。如果在任何特定的文件夹级别有更多的元素需要检查,我可以添加更多“$current_folder->elementname”来访问“local”元素。我走对了吗?你走对了$文件夹和$file变量是SimpleXMLElement对象。允许非常轻松地访问XML文档的每个元素。
<?php

function indepth($path, $current_folder)
{
    global $project_name, $project_type;
    $path[] = $current_folder->name;    
    foreach ($current_folder->File as $file) {
        echo $project_name . ',' . $project_type . ',' . implode('/', $path) . ', ' . $file->filename . "\n";
    }
    foreach ($current_folder->Folder as $folder) {
        indepth($path, $folder);
    }
}

$myxml = simplexml_load_file('test.xml');
$project_name = $myxml->Project->ProjectName;
$project_type = $myxml->Project->ProjectType;

foreach ($myxml->Folder as $folder) {
    indepth(array(), $folder);
}