如何使用PHP DOM重新排列XML节点?

时间:2017-02-05 15:14:45

标签: php xml dom

我需要使用PHP DOM以暂存的顺序重新排列table_data节点。

例如,考虑到下面的XML,我需要在表中排列的表数据 以下顺序:

bugs_status
attachments
bugs
Version

所以,这个XML需要从这个开始:

<database name="foodatabase">
   <table_data name="Version">
   </table_data>
   <table_data name="attachments">
   </table_data>
   <table_data name="bugs">
       <row> 
           <field name="problem_id">7</field>
           <field name="problem">Something is broken</field>
       </row>
       <row> 
           <field name="problem_id">8</field>
           <field name="problem">Something else is broken</field>
       </row>
   </table_data>
   <table_data name="bugs_status">
       <row>
           <field name="bugs_status_id">1</field>
           <field name="bugs_status_priority">5</field>
           <field name="bugs_status_name">Acknowledged</field>
       </row>
       <row>
           <field name="bugs_status_id">2</field>
           <field name="bugs_status_priority">10</field>
           <field name="bugs_status_name">Feedback</field>
       </row>
       <row>
           <field name="bugs_status_id">3</field>
           <field name="bugs_status_priority">20</field>
           <field name="bugs_status_name">Client Confirmation</field>
       </row>
   </table_data>
</database>

到此:

 <database name="foodatabase">
   <table_data name="bugs_status">
       <row>
           <field name="bugs_status_id">1</field>
           <field name="bugs_status_priority">5</field>
           <field name="bugs_status_name">Acknowledged</field>
       </row>
       <row>
           <field name="bugs_status_id">2</field>
           <field name="bugs_status_priority">10</field>
           <field name="bugs_status_name">Feedback</field>
       </row>
       <row>
           <field name="bugs_status_id">3</field>
           <field name="bugs_status_priority">20</field>
           <field name="bugs_status_name">Client Confirmation</field>
       </row>
   </table_data>
   <table_data name="attachments">
   </table_data>
   <table_data name="bugs">
       <row> 
           <field name="problem_id">7</field>
           <field name="problem">Something is broken</field>
       </row>
       <row> 
           <field name="problem_id">8</field>
           <field name="problem">Something else is broken</field>
       </row>
   </table_data>
   <table_data name="Version">
   </table_data>
</database>

请注意,table_data节点及其子节点一起移动。这很重要,因为我们正在重新排列这些表及其行以满足外键关系。

从概念上讲,这并不困难,反转列表,然后通过搜索列表中的每个节点并将其放在元素的第一个子节点之前重新排列它们。

我的问题是:我无法弄清楚如何抓取指定节点,将其从当前位置移除,并将其放在第一个孩子面前。

2 个答案:

答案 0 :(得分:0)

我想说,这是一个糟糕的设计,因为你依赖于XML的特定结构。这会让你后来头疼。

也许相反,您应该创建一个数组并使用XML的键对数组进行排序,然后按顺序获取XML节点。

如果在PHP中使用SimpleXML类加载XML,这应该不难。

http://php.net/manual/en/simplexml.examples.php&lt; =查看手册。

答案 1 :(得分:0)

由于目标是按特定顺序重新排列XML节点,因此答案结果是在从MySQL转发它们时将这些表按顺序指定

根据所需的表顺序,C,D,A,B,命令为:

sudo mysqldump --defaults-file=/root/.my.cnf --xml -t  foodatabase C D A B > /path/to/file.xml