PHP SimpleXML问题...迭代XML的每一行确定使用的标记

时间:2011-01-25 21:25:50

标签: php xml simplexml

我是一名互动的PHP开发人员,试图通过XML解析我的第一个镜头。我了解基础知识,循环遍历节点并打印它们及其属性。我遗失的一件事是如何检查和编写XML文档中标记名称的条件?

所以我需要做的是读取xml文件的每一行:

确定其是否为开放的<level>代码并替换为<UL> 确定其<file>标记,并将其替换为<li>file</li> 确定其是</level>标记,并将其替换为</ul>

级别标记具有区分它们的属性。

XML看起来像这样

<level dirname="1">
     <file>Filename1</file>
     <file>Filename2</file>
     <file>Filename3</file>
     <file>Filename4</file>
 </level>
<level dirname="2">
     <file>Filename1</file>
     <file>Filename2</file>
     <file>Filename3</file>
     <file>Filename4</file>
 </level>
<level dirname="3">
     <level dirname = "5">
            <file>Filename1</file>
            <file>Filename2</file>
            <file>Filename3</file>
            <file>Filename4</file>
     </level>
 </level>

它应该看起来像这样:

<ul>
     <li>Filename1</li>
     <li>Filename2</li>
     <li>Filename3</li>
     <li>Filename4</li>
 </ul>
<ul>
     <li>Filename1</li>
     <li>Filename2</li>
     <li>Filename3</li>
     <li>Filename4</li>
 </ul>
<ul>
     <ul>
            <li>Filename1</li>
            <li>Filename2</li>
            <li>Filename3</li>
            <li>Filename4</li>
     </ul>
 </ul>

注意嵌套的<level>标签....因为这样我不能简单地回显<ul> </ul>然后循环<li>标签....我有获取xml文件中的每个元素,并决定用哪个标记替换它。

任何帮助都会很棒。

由于

克雷格

1 个答案:

答案 0 :(得分:1)

您需要创建递归函数。这将检查是否存在嵌套级别,如果有,则使用相同的函数生成它们。

注意,您需要使用(string)转换文件节点以将其打印出来!

function printLevel(SimpleXMLElement $e){
    $re = '';
    if(!empty($e->level)){ // checking for nested levels
        foreach($e->level as $lvl){
            $re .= '<ul>'.printLevel($lvl)."</ul>\n";
        }
    }

    if(!empty($e->file)){ // checking for files
        foreach($e->file as $file){
            $re .= '<li>'.(string)$file."</li>\n";
        }
    }
    return $re;
}

$xml = new SimpleXMLElement($xmlText);
echo printLevel($e);

这样可行。但是你的XML格式不正确!添加覆盖根元素并替换为&gt;!