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