0

私はここStackOverflowでPHPとXMLについて少し質問していて、すべてのコーダーのおかげでそれを把握していますが、時々行き詰まります。

2つの子が正しく設定されている場合、ノードを削除できるようにしたいですか?私はこれを試してきました:

$xml = new DOMDocument();
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->loadXML('<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
  <game id="86102">
    <opponent>shoooorty</opponent>
    <oppid>2512</oppid>
    <lastdraw>2</lastdraw>
    <turn>1</turn>
    <image>noimage.png</image>
    <nextdraw>6198</nextdraw>
    <infopop>0</infopop>
    <playertilesum>73</playertilesum>
    <oppnation>0</oppnation>
  </game>
  <game id="88341">
    <opponent>Jmemek</opponent>
    <oppid>1917</oppid>
    <lastdraw>3</lastdraw>
    <turn>2</turn>
    <image>1917a.png</image>
    <nextdraw>3107</nextdraw>
    <infopop>1</infopop>
    <playertilesum>27</playertilesum>
    <oppnation>0</oppnation>
  </game>
  <game id="88382">
    <opponent>Gitteloven</opponent>
    <oppid>3153</oppid>
    <lastdraw>1</lastdraw>
    <turn>1</turn>
    <image>noimage.png</image>
    <nextdraw>2953</nextdraw>
    <infopop>1</infopop>
    <playertilesum>19</playertilesum>
    <oppnation>0</oppnation>
  </game>
</data>
');

// original
echo "<xmp>OLD:\n". $xml->saveXML() ."</xmp>";

$opNodes = $xml->getElementsByTagName('turn');
$opNodes2 = $xml->getElementsByTagName('infopop');
foreach($opNodes as $node){
    $xmlTurn = trim($node->nodeValue);
    foreach($opNodes2 as $node2){
        $xmlPopup = trim($node2->nodeValue);
        if($xmlTurn < 2 && $xmlPopup == 1){
            $gameNode = $node->parentNode;
            $gameNode->parentNode->removeChild($gameNode);
        }
    }
}

echo "<xmp>NEW:\n". $xml->saveXML() ."</xmp>";

ターンが2未満で、infopop = 1であるすべてのゲームを削除したいのですが、この場合、最後のゲームを削除する必要があります...しかし、それは機能しませんか?私は何が間違っているのですか?

前もって感謝します!

4

1 に答える 1

0

個人的には、PHPでXMLを処理する場合、DOMDocumentよりもSimpleXMLを使用する方がはるかに簡単であることがわかりました。ただし、ここでコードを機能させます。:)

<?php
$xml = new DOMDocument();
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->loadXML('<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
  <game id="86102">
    <opponent>shoooorty</opponent>
    <oppid>2512</oppid>
    <lastdraw>2</lastdraw>
    <turn>1</turn>
    <image>noimage.png</image>
    <nextdraw>6198</nextdraw>
    <infopop>0</infopop>
    <playertilesum>73</playertilesum>
    <oppnation>0</oppnation>
  </game>
  <game id="88341">
    <opponent>Jmemek</opponent>
    <oppid>1917</oppid>
    <lastdraw>3</lastdraw>
    <turn>2</turn>
    <image>1917a.png</image>
    <nextdraw>3107</nextdraw>
    <infopop>1</infopop>
    <playertilesum>27</playertilesum>
    <oppnation>0</oppnation>
  </game>
  <game id="88382">
    <opponent>Gitteloven</opponent>
    <oppid>3153</oppid>
    <lastdraw>1</lastdraw>
    <turn>1</turn>
    <image>noimage.png</image>
    <nextdraw>2953</nextdraw>
    <infopop>1</infopop>
    <playertilesum>19</playertilesum>
    <oppnation>0</oppnation>
  </game>
</data>
');

// original
echo "<xmp>OLD:\n". $xml->saveXML()."</xmp>";

print "number of games: ".$xml->getElementsByTagName("game")->length."<br />\n";

// get the list of games and store the length param
$games = $xml->getElementsByTagName("game");
$len   = $games->length;

// loop the games
for( $i=0; $i<$len; $i++ )
{
    // reset tracking for whether or not to delete this game
    $turn_lt_2 = false;
    $infopop_eq_1 = false;

    // get the game node
    $game = $games->item($i);
    // loop the game's child nodes and look for the turn and infopop
    foreach( $game->childNodes as $node )
    {
        switch( $node->nodeName )
        {
            case "turn":
                if( (int)$node->nodeValue < 2 ) { $turn_lt_2 = true; }
            break;

            case "infopop":
                if( (int)$node->nodeValue === 1 ) { $infopop_eq_1 = true; }
            break;
        }
    }

    // check to see if both conditions were met
    if( ($turn_lt_2 === true) && ($infopop_eq_1 === true) )
    {
        print "deleting game <b>[".$i."]</b><br />\n";
        $game->parentNode->removeChild($game);
    }
}

echo "<xmp>NEW:\n". $xml->saveXML() ."</xmp>";
print "new number of games: ".$games->length."<br />\n";
?>
于 2012-09-25T21:58:15.617 に答える