2017-02-05 5 views
0

Мне нужно перенастроить узлы table_data в перкриптивном порядке с помощью PHP DOM.Как изменить XML-узлы с помощью PHP DOM?

Например, учитывая 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 и их дочерние узлы перемещаются вместе р. Это важно, потому что мы переставляем эти таблицы и их строки для удовлетворения внешних отношений.

Понятно, что это не сложно, инвертируйте список, а затем перенастройте их, выполнив поиск каждого узла в списке и разместив его перед первым дочерним элементом этого элемента.

Моя проблема: я не могу понять, как захватить указанный узел, удалить его из текущей позиции и поместить его перед первым ребенком.

+0

В теории порядок узлов XML должен не имеет значения, так как в этом случае запросы будут XPath всегда работают независимо друг от друга порядка. Если вы просто зацикливаетесь на XML и полагаетесь на заказ, то, как вы достигнете этого, будет зависеть ваша библиотека читателей XML, которую вы используете. – apokryfos

+0

[PHPUnit не удалось импортировать базу данных] (https://phpunit.de/manual/current/en/database.html#database.beware-of-foreign-keys) правильно, если вы не закажете таблицы, в которых размещены внешние ключи выше таблицы, в которых они нуждаются. Я решил это, передав таблицы в правильном порядке в mysqldump. – DrDamnit

ответ

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 
0

Я бы сказал, что это плохой дизайн, поскольку вы полагаетесь на определенную структуру вашего XML. Это даст вам головную боль позже.

Возможно, вместо этого вы должны сделать массив и отсортировать массив с помощью ключей вашего XML, а затем захватить узлы XML в этом порядке.

Если вы загрузите XML классом SimpleXML в PHP, это не составит труда.

http://php.net/manual/en/simplexml.examples.php < = Посмотрите в руководстве.

+0

В моих попытках быть краткими в моем вопросе я скрывал тот факт, что я действительно использую массивы для предварительной сортировки всех этих данных. Но я открыт для предложений о том, как улучшить его. «Захват узлов в том порядке, в котором я хочу», на самом деле не вариант, поскольку он предназначен для использования в качестве набора тестовых данных с помощью PHPUnit. Таким образом, мне нужно получить результирующий XML-файл с узлами в указанном порядке, иначе я не смогу удовлетворить отношения внешних ключей (я уже написал код, который определяет приоритет внешнего ключа, исследуя db). Я начал с SimpleXML, но в итоге получилось больше смысла использовать PHP DOM. \ – DrDamnit

+0

Пункт моего комментария выше, чтобы дать задний план и объяснить, что мне нужен результирующий документ XML, который имеет узлы в указанном порядке, потому что PHPUnit не будет «захватить узлы в указанном порядке.«Он загружает их в том порядке, в котором они находятся в файле XML. Это боль, которую нужно сделать вручную, поэтому я создаю сценарий для автоматизации процесса. – DrDamnit

Смежные вопросы