Добавить узлы в более глубокие ветви дерева XML - PullRequest
2 голосов
/ 19 июля 2011

Я разрабатываю веб-интерфейс, который позволяет администраторам блокировать / снимать запрет на отдельных пользователей с моего сервера, чье программное обеспечение зависит от файла XML для определения статуса запрета пользователей.Первоначально «Bans.xml» имеет следующее содержимое:

    <Bans version="1.036">
      <Nick>
         <Ban>
           <Overrideable enable="false"/>
           <Nick>cray</Nick>
         </Ban>
      </Nick>
    </Bans>

Как мне написать php-код, чтобы я получил следующий XML-файл?

    <Bans version="1.036">
      <Nick>
         <Ban>
           <Overrideable enable="false"/>
           <Nick>cray</Nick>
         </Ban>
         <Ban>
           <Overrideable enable="false"/>
           <Nick>newuser</Nick>
         </Ban>
      </Nick>
    </Bans> 

Пока что ямне удалось написать следующий скрипт:

    <?php
      $xml=new DOMDocument();
      $xml->formatOutput=true;
      $xml->preserveWhiteSpace=false;
      $xml->load("Bans.xml");
      $root=$xml->documentElement;
      $fnode=$root->firstChild;
      $ori=$fnode->childNodes->item(2);
      $nick=$xml->createElement("Nick");
      $nickText=$xml->createTextNode("newuser");
      $nick->appendChild($nickText);
      $ban=$xml->createElement("Ban");
      $ban->appendChild($nick);
      $root->insertBefore($ban,$ori);
      header("Content-type:text/xml");
      $xml->save('Bans.xml');    
     ?>

Но все, что дает мне приведенный выше код:

    <Bans version="1.036">
      <Nick>
        <Ban>
          <Overrideable enable="false"/>
          <Nick>cray</Nick>
        </Ban>
      </Nick>
      <Ban>
        <Nick>Crayaas</Nick>
      </Ban>
    </Bans>   

-------- Мне удалосьправильно добавьте узлы, заменив; ---------

    $root->insertBefore($ban,$ori);

на следующий код;

    $fnode->insertBefore($ban,$ori);

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

    $buser="newuser";                
    $dom=new DOMDocument();
    $dom->load('settings/Bans.xml');
    $bans=$dom->documentElement;
    $xpath=new DOMXpath($dom);
    $result=$xpath->query('/Bans/Nick/Ban[Nick="$buser"]');
    $result->item(0)->parentNode->removeChild($result->item(0));
    header("Content-type: text/xml");
    $dom->save('settings/Bans.xml');        

Был бы рад, если бы на этот вопрос также можно было ответить;)

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Вы хотите добавить новое поддерево следующим образом:

 <Ban>
    <Overrideable enable="false"/>
    <Nick>newuser</Nick>
 </Ban>

Следовательно, создайте эту структуру и затем appendChild в /Bans/Nick.

Наsidenote, ваше именование элемента несколько сомнительно, потому что ваши имена элементов имеют различную семантику в зависимости от того, где они встречаются.Хотя вы можете сделать это, я думаю, вы могли бы сделать это менее двусмысленным, удалив / Bans / Nick в целом и просто используя:

<Bans version="1.036">
   <Ban>
      <Overrideable enable="false"/>
      <Nick>cray</Nick>
   </Ban>
</Bans>

Тогда вы просто добавили бы к корневому элементу.

1 голос
/ 19 июля 2011

Это:

$root->insertBefore($ban,$ori);

Должно быть:

$fnode->insertBefore($ban,$ori);

В конце концов, <Nick> не корневой узел, а первый его потомок

...