PHP SimpleXML问题…遍历每行XML确定使用的标记

PHP SimpleXML问题…遍历每行XML确定使用的标记,php,xml,simplexml,Php,Xml,Simplexml,我是一个中间的PHP开发人员,试图通过XML进行解析。我了解基本知识,遍历节点并打印它们及其属性。有一件事我弄丢了,那就是如何在XML文档中检查和写入标记名的条件 所以我需要做的是读取xml文件的每一行: 确定其是否为打开的标签,并替换为 确定它的标记的名称,并用文件替换它 确定其是否为标签,并将其替换为 级别标记具有区分它们的属性 XML看起来像这样 <level dirname="1"> <file>Filename1</file> &

我是一个中间的PHP开发人员,试图通过XML进行解析。我了解基本知识,遍历节点并打印它们及其属性。有一件事我弄丢了,那就是如何在XML文档中检查和写入标记名的条件

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

确定其是否为打开的
标签,并替换为
确定它的
标记的名称,并用
  • 文件替换它
  • 确定其是否为
    标签,并将其替换为

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

    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>
    
    
    文件名1
    文件名2
    文件名3
    文件名4
    文件名1
    文件名2
    文件名3
    文件名4
    文件名1
    文件名2
    文件名3
    文件名4
    
    结果应该是这样的:

    <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>
    
    • 文件名1
    • 文件名2
    • 文件名3
    • 文件名4
    • 文件名1
    • 文件名2
    • 文件名3
    • 文件名4
      • 文件名1
      • 文件名2
      • 文件名3
      • 文件名4
    请注意嵌套的
    标记…因此,我不能简单地回显
        然后循环查找
      • 标记…我必须获取xml文件中的每个元素,并决定用哪个标记替换它

        任何帮助都会很好

        谢谢


        Craig

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

        请注意,您需要使用(字符串)强制转换文件节点以将其打印出来

        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);
        
        函数打印级别(SimpleXMLElement$e){
        $re='';
        如果(!empty($e->level)){//检查嵌套的级别
        foreach($e->级别为$lvl){
        $re.='
          '.printLevel($lvl)。“
        \n”; } } 如果(!empty($e->file)){//正在检查文件 foreach($e->file as$file){ $re.='
      • '(字符串)$file.
      • \n; } } 退还$re; } $xml=新的simplexmlement($xmlText); 回音打印级别(e美元);

        这会奏效的。但是您的XML格式不正确!添加一个覆盖根元素并将其替换为>

        嘿,谢谢你的快速回复…我今天无法测试,但我会在AM中查看一下…是的,当然XML有根标记等等…我只是键入它来给你一个ideaWell,它给出了预期的结果。但它不处理任何属性,因此需要使用$e->attributes()。您可以在PHP中找到非常好的手册。唯一让我头疼的是获取元素(甚至属性)的文本值:您需要像(string)$element这样的大小写!根据您所做的工作,您可能希望了解XSLT。它将XML文档转换为XML或HTML。不过,如果你是初学者,学习起来可能会很困难。