2

管理者がサーバーから特定のユーザーを禁止/禁止解除できるようにする Web インターフェイスを開発しています。そのソフトウェアは XML ファイルに依存してユーザーの禁止ステータスを決定します。当初、「Bans.xml」には次の内容が含まれています。

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

次の XML ファイルを取得するように php コードを作成するにはどうすればよいですか?

    <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');        

こちらも回答いただけると嬉しいです(;_;)

4

2 に答える 2

1

これ:

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

する必要があります:

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

結局のところ、<Nick>ルートノードではなく、その最初の子です

于 2011-07-19T19:17:41.060 に答える
1

次のように新しいサブツリーを追加します。

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

したがって、その構造を構築してから、appendChildを /Bans/Nick に追加します。

余談ですが、要素の名前は発生する場所によってセマンティクスが異なるため、要素の命名には多少の疑問があります。あなたはそれを行うことができますが、 /Bans/Nick を完全に削除して次のものを使用することで、あいまいさを軽減できると思います:

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

次に、ルート要素に追加するだけです。

于 2011-07-19T19:27:28.843 に答える