dongpin6941 2017-11-07 12:30
浏览 72
已采纳

PHP - 将动态XML对象转换为HTML列表

I'm using PHP and I wrote an application that creates and fills a SimpleXMLObject with the results of a database query. The results are saved as tags.

Background information on the application:

The variables I get from that query are like this "a/b/c" and I use explode to split this variable and add each individual instance as an own XML-tag.

For example $parts = explode("/", $cropSpace);

So that means I never know beforehand how many variables are created with explode and what the names of those nodes are.

What I want to accomplish:

I want to transform this XML object with dynamically generated nodes and size into an HTML list (<ul><li>)

What I tried:

I looked up many guides on how to accomplish such a thing but all of them are focused on a static XML object/file in which you already know the names of the nodes. Since I dont know the names of the nodes and the size of the object, I tried on my own this

foreach ($parts as $part) {
      if (!is_numeric($part)) {
         if (!isset($set->$part)) {
            $set = $set->addChild($part);
            echo "<ul><li>$part</li>";
            $counter++;
         } else {
            $set = $set->$part;
                }
      for ($i = 0; $i < $counter - 1; $i++){
      echo "</ul>";
      }
}

I know why it isn't working (unlike in the creating the XML object it doesn't check if that list was already created) but i don't know how to do it.

Example Expected Output: For example I have these four variables

  • a/b/c/d
  • a/b/c/e
  • a/b/f
  • g/h Then the XML object is created like this / contains this.

And I want this XML object to be displayed in a HTML list like this.

I know it is a lot to read but I would really appriciate the help. Thanks in advance.

EDIT

Here is an example of the original XML File but it is very big and changes for every user.

<?xml version="1.0"?>
<permissions>
    <sogo>
        <jost>
            <Calendar>
                <PersönlicherKalender>
                    <ConfidentialModifier/>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <PrivateModifier/>
                    <PublicModifier/>
                </PersönlicherKalender>
                <IfIKalenderBJ>
                    <ConfidentialModifier/>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <PrivateModifier/>
                    <PublicModifier/>
                </IfIKalenderBJ>
            </Calendar>
        </jost>
        <ificalendars>
            <Calendar>
                <Meetings>
                    <ObjectEraser/>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <ObjectCreator/>
                    <PublicModifier/>
                    <ConfidentialDAndTViewer/>
                    <PublicViewer/>
                    <PublicViewer/>
                </Meetings>
                <Events>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <PublicModifier/>
                    <ConfidentialDAndTViewer/>
                    <PublicViewer/>
                    <PublicViewer/>
                </Events>
            </Calendar>
        </ificalendars>
        <ifiabsences>
            <Calendar>
                <Barbara>
                    <PublicModifier/>
                    <ConfidentialModifier/>
                    <PrivateModifier/>
                    <ObjectCreator/>
                    <ObjectEraser/>
                    <PublicViewer/>
                    <PublicViewer/>
                </Barbara>
                <Nico......meetings>
                    <PublicViewer/>
                </Nico......meetings>
                <PublicViewer/>
                <Erica......meetings>
                    <PublicViewer/>
                </Erica......meetings>
                <PublicViewer/>
                <Tammy......meetings>
                    <PublicViewer/>
                </Tammy......meetings>
                <PublicViewer/>
                <Daniela......meetings>
                    <PublicViewer/>
                </Daniela......meetings>
                <PublicViewer/>
                <Marina......meetings>
                    <PublicViewer/>
                </Marina......meetings>
                <PublicViewer/>
                <Mona......meetings>
                    <PublicViewer/>
                </Mona......meetings>
                <PublicViewer/>
                <Enrico......meetings>
                    <PublicViewer/>
                </Enrico......meetings>
                <PublicViewer/>
                <Claudia......meetings>
                    <PublicViewer/>
                </Claudia......meetings>
                <PublicViewer/>
                <Beat......meetings>
                    <PublicViewer/>
                </Beat......meetings>
                <PublicViewer/>
                <Nathan......meetings>
                    <PublicViewer/>
                </Nathan......meetings>
                <PublicViewer/>
                <Hanspeter......meetings>
                    <PublicViewer/>
                </Hanspeter......meetings>
                <PublicViewer/>
                <Elida......meetings>
                    <PublicViewer/>
                </Elida......meetings>
                <PublicViewer/>
                <Kim......meetings>
                    <PublicViewer/>
                </Kim......meetings>
                <PublicViewer/>
            </Calendar>
        </ifiabsences>
        <ifilehrbereich......lehrbereich>
            <Calendar......lehrbereich>
                <PlanungLehre......lehrbereich>
                    <PublicModifier/>
                </PlanungLehre......lehrbereich>
            </Calendar......lehrbereich>
        </ifilehrbereich......lehrbereich>
        <Calendar......lehrbereich>
            <PlanungLehre......lehrbereich>
                <PublicModifier/>
            </PlanungLehre......lehrbereich>
        </Calendar......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <PlanungLehre......lehrbereich>
            <PublicModifier/>
        </PlanungLehre......lehrbereich>
        <Lehrbereich......lehrbereich>
            <PublicModifier/>
        </Lehrbereich......lehrbereich>
        <PublicModifier/>
        <ifistundenplan......stundenplan>
            <Calendar......stundenplan>
                <Ass......stundenplan>
                    <PublicModifier/>
                </Ass......stundenplan>
            </Calendar......stundenplan>
        </ifistundenplan......stundenplan>
        <Calendar......stundenplan>
            <Ass......stundenplan>
                <PublicModifier/>
            </Ass......stundenplan>
        </Calendar......stundenplan>
        <Ass......stundenplan>
            <PublicModifier/>
        </Ass......stundenplan>
        <PublicModifier/>
        <PublicModifier/>
        <CL......stundenplan>
            <PublicModifier/>
        </CL......stundenplan>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <BSc......stundenplan>
            <PublicModifier/>
        </BSc......stundenplan>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <MSc......stundenplan>
            <PublicModifier/>
        </MSc......stundenplan>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <ifireservations......raumreservation>
            <Calendar......raumreservation>
                <BIN0.B.04......raumreservation>
                    <PublicModifier/>
                </BIN0.B.04......raumreservation>
            </Calendar......raumreservation>
        </ifireservations......raumreservation>
        <Calendar......raumreservation>
            <BIN0.B.04......raumreservation>
                <PublicModifier/>
            </BIN0.B.04......raumreservation>
        </Calendar......raumreservation>
        <BIN0.B.04......raumreservation>
            <PublicModifier/>
        </BIN0.B.04......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <BIN0.B.06......raumreservation>
            <PublicModifier/>
        </BIN0.B.06......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <BIN1.D.29......raumreservation>
            <PublicModifier/>
        </BIN1.D.29......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <BIN2.A.01......raumreservation>
            <PublicModifier/>
        </BIN2.A.01......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <BIN2.A.06......raumreservation>
            <PublicModifier/>
        </BIN2.A.06......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <BIN2.D.27......raumreservation>
            <PublicModifier/>
        </BIN2.D.27......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <BIN2.E.23......raumreservation>
            <PublicModifier/>
        </BIN2.E.23......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <RAID-017......raumreservation>
            <PublicModifier/>
        </RAID-017......raumreservation>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <PublicModifier/>
        <ifireservations......meetings>
            <Calendar......meetings>
                <Coffeemachine1......meetings>
                    <PublicViewer/>
                </Coffeemachine1......meetings>
            </Calendar......meetings>
        </ifireservations......meetings>
        <Calendar......meetings>
            <Coffeemachine1......meetings>
                <PublicViewer/>
            </Coffeemachine1......meetings>
        </Calendar......meetings>
        <Coffeemachine1......meetings>
            <PublicViewer/>
        </Coffeemachine1......meetings>
        <PublicViewer/>
        <PublicViewer/>
        <Coffeemachine2......meetings>
            <PublicViewer/>
        </Coffeemachine2......meetings>
        <PublicViewer/>
        <PublicViewer/>
        <PublicViewer/>
        <PublicViewer/>
        <Coffeemachine3......meetings>
            <PublicViewer/>
        </Coffeemachine3......meetings>
        <PublicViewer/>
        <PublicViewer/>
        <PublicViewer/>
        <PublicViewer/>
    </sogo>
</permissions>
  • 写回答

3条回答 默认 最新

  • doog1092 2017-11-07 14:17
    关注

    I'm not entirely sure I understand exactly what you are after. Perhaps this does it for you or is at least close.

    There are several examples of recursing XML at http://php.net/manual/en/simplexmlelement.children.php

    <?php
    
    class XmlRecurser {
    
        public $output;
        const Indent = 2;
    
        function recurse($x) {
            $this->output = "<ul>
    ";
            $this->output .= $this->space(self::Indent) . "<li>" . $x->getName() . "</li>
    ";
    
            $this->recurseXML($x, self::Indent);
    
            $this->output .= "</ul>
    ";
        }
    
        function recurseXML($x, $indent = 0, $parent="") { 
            $child_count = 0; 
            foreach($x as $key => $child) { 
                $child_count++;     
                $this->output .=  $this->space($indent) . "<ul>
    " .
                    $this->space($indent+self::Indent) . "<li>" . $key . "</li>
    ";
                    // Walk through attributes on this node.
                    foreach ($child->attributes() as $attrkey => $attrvalue) {
                        $this->output .= 
                            $this->space($indent+self::Indent) . "attribute: " . $attrkey  . '=' . $attrvalue .  "
    ";
                    }
    
    
                // $this->output .=  str_repeat(' ', $indent) . '<' . $key . ">
    ";
                // no children, aka "leaf node" 
                if ( $this->recurseXML($child, $indent+self::Indent, $parent.".".$key) == 0 )  { 
                    //print($parent . "." . (string)$key . " = " . (string)$value . "<BR>
    ");        
    
                }
                $this->output .=  $this->space($indent) . "</ul>
    ";
    
                // $this->output .=  str_repeat(' ', $indent) . '</' .  $key . ">
    ";
            } 
            return $child_count; 
        }
    
        function space($n) {
            return str_repeat(' ', $n);
        }
    
    } 
    
    // Some sample XML. 
    $xml = '
    <permissions>
        <sogo sogo-attr1="sogo-value-1" sogo-attr2="sogo-value-2">
            <jost jost-attr1="jost-value-1" jost-attr2="jost-value-2">
                <Calendar>
                    <PersönlicherKalender>
                        <ConfidentialModifier/>
                        <ObjectCreator/>
                        <ObjectEraser/>
                        <PrivateModifier/>
                        <PublicModifier/>
                    </PersönlicherKalender>
                    </Calendar>
            </jost>
        </sogo>
    </permissions>
    ';
    
    $x = simplexml_load_string($xml);
    $r = new XmlRecurser;
    $s = $r->recurse($x);
    echo $r->output;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型