PHP创建递归的DomDocument

时间:2015-02-25 13:33:23

标签: php xml recursion

我正在尝试从数据库表创建以下XML。这是XML

<groups>
     <group id="1" name="DEBUG"/>
     <group id="2" name="ORSP">
          <group id="3" name="PRE">
               <group id="4" name="TRANS"/>
               <group id="5" name="OPP"/>
          </group>
          <group id="6" name="POST">
               <group id="7" name="DGM"/>
          </group>
     </group>
</groups>

这是数据库的简单表

GROUP_ID | GROUP_NAME | GROUP_PARENT 
1            DEBUG       NULL 
2            ORSP        NULL 
3            PRE         2 
4            TRANS       3 
5            OPP         3 
6            POST        2 
7            DGM         6

这是我目前的代码。我正在尝试返回一个DomElement 但是我永远无法获得上述XML。使用字符串我能够生成XML。欢迎任何建议。

    public function process(){
        $xml = '<groups>';
        $xml .= $this->getAllGroups();
        $xml .= '</groups>';

        return $xml;
    }

    public function getAllGroups($groupID=null){
        $where = null;
        $placeholder = array();
        $xml = null;

        if (is_null($groupID)){
            $where = " GROUP_PARENT IS NULL ";
        }
        else {
            $where = " GROUP_PARENT=?";
            $placeholder=array($groupID);
        }

        $sql = "SELECT
                    GROUP_ID,
                    GROUP_NAME
                FROM
                    GROUPS
                WHERE
                    $where";
        $data = $this->dbh->executeSql($sql,$placeholder);
        foreach ($data["records"] as $row) {
            $groupID = $row["GROUP_ID"];
            $groupName = $row["GROUP_NAME"];

            //$groupElement = $this->xml->createElement("group");
            //$groupElementID = $this->xml->createAttribute("id");
            //$groupElementName = $this->xml->createAttribute("name");
            //$groupElementID->value = $groupID;
            //$groupElementName->value = $groupName;
            //$groupElement->appendChild($groupID);
            //$groupElement->appendChild($groupName);
            //$passedXML->appendChild($groupElement);
            //$this->getAllGroups($groupID);

            $xml .= "<group id='$groupID' name='$groupName'>";
            $xml .= $this->getAllGroups($groupID);
            $xml .= "</group>";
        }
        return $xml;
    }

1 个答案:

答案 0 :(得分:0)

玩完代码后,我神奇地找到了解决方案。把头撞到了墙上一天半。希望这可能在将来帮助其他人。

public function process(){
    $xml = $this->getAllGroups();
    return $xml;
}

public function getAllGroups(\DOMElement &$xml=null,$groupID=null){
    $where = null;
    $placeholder = array();

    if (is_null($groupID)){
        $where = " GROUP_PARENT IS NULL ";
        $xml = $this->xml->createElement("groups");
    }
    else {
        $where = " GROUP_PARENT=?";
        $placeholder=array($groupID);
    }

    $sql = "SELECT
                GROUP_ID,
                GROUP_NAME
            FROM
                GROUPS
            WHERE
                $where";
    $data = $this->dbh->executeSql($sql,$placeholder);
    foreach ($data["records"] as $row) {
        $groupID = $row["GROUP_ID"];
        $groupName = $row["GROUP_NAME"];

        $groupElement = $this->xml->createElement("group");
        $groupElementID = $this->xml->createAttribute("id");
        $groupElementName = $this->xml->createAttribute("name");
        $groupElementID->value = $groupID;
        $groupElementName->value = $groupName;
        $groupElement->appendChild($groupElementID);
        $groupElement->appendChild($groupElementName);
        $xml->appendChild($groupElement);
        $this->getAllGroups($groupElement,$groupID);
    }
    return $xml;
}