Как переместить дочерний узел на уровень родительского узла в xml? - PullRequest
0 голосов
/ 20 ноября 2010

Недавно я работал с xml-кодированием, и проблема возникла.

Учитывая xml, как это:

<Colonel id="1">
  <Lieutenant_Colonel id="2">
    <Secretary id="6"/>
  </Lieutenant_Colonel>
  <Lieutenant_Colonel id="3">
    <Secretary id="7"/>
  </Lieutenant_Colonel>
  <Secretary id="5"/>
</Colonel>

теперь полковник (id = 1) ушел с секретарем (id = 5)

xml, который мы хотим, похож на

<!-- <Colonel id="1"> -->
  <Lieutenant_Colonel id="2">
    <Secretary id="6"/>
  </Lieutenant_Colonel>
  <Lieutenant_Colonel id="3">
    <Secretary id="7"/>
  </Lieutenant_Colonel>
  <!--
  <Secretary id="5"/>
</Colonel> -->

или

<Lieutenant_Colonel id="2">
  <Secretary id="6"/>
</Lieutenant_Colonel>
<Lieutenant_Colonel id="3">
  <Secretary id="7"/>
</Lieutenant_Colonel>

Как это сделать?

пожалуйста, помогите мне

1 Ответ

0 голосов
/ 20 ноября 2010

Это довольно длинный вопрос, поэтому мне придется обратиться к другим вопросам. Сначала рассмотрим эту функцию:

function RemoveColonel($id, $secretaryId)
{
    $colXpath = '//colonel[@id="' . $id . '"]';
    $secXpath = $colXpath . '/Secretary[@id="' . $secretaryId . '"]';

    RemoveNode($secXpath);
    $colChildren = $rootXml->xpath($colXpath)->children();
    $children = array();

    foreach ($colChildren as $child ){
        $children[] = $child;
    }

    RemoveNode($colXpath);
    return $children;
}

Учитывая идентификатор полковника и секретаря этого полковника, он удаляет секретаря, а затем спасает детей полковника, чтобы удалить полковника и вернуть его. После этого вы можете снова вставить свои элементы в корневой узел, если хотите. Если у вас не может быть идентификатора секретаря в момент удаления полковника, вы можете обойти xpath, чтобы удалить секретаря как потомка полковника, удалив спецификацию id.

Код RemoveNode немного длинный, поэтому мне придется дать вам этот вопрос о том, как удалять узлы, используя SimpleXML в PHP.

Я надеюсь, что смогу помочь!

...