2010-12-30 14 views
0
$xml = '<books>  
      <book> 
       <qty>12</qty> 
       <title>C++</title> 
      </book> 
      <book> 
       <qty>21</qty> 
       <title>PHP</title> 
      </book>  
     </books>  
     <books>   
      <book> 
      <qty>21</qty> 
      <title>JAVA</title> 
      </book>  
     </books>'; 


$str = '<content>'.$xml.'</content>'; 

$doc = new DOMDOcument; 
$doc->loadxml($str); 

$xpath = new DOMXpath($doc); 

$arr = array(
    array('12;C++', '21;PHP') 
); 

# Remove elements based on qty and title 
foreach($arr as $items) { 
    foreach($items as $item) { 
     list($qty, $title) = explode(';', $item); 
     foreach($xpath->query('/content/books/book[title="'.$title.'"][qty="'.$qty.'"]') as $book) { 
      $book->parentNode->removeChild($book); 
     } 
    } 
} 

# Remove empty <books> 
foreach($xpath->query('books[count(book)=0]') as $empty) { 
    $empty->parentNode->removeChild($empty); 
} 
header('Content-type: text/xml'); 
echo $doc->savexml(); 

OUTPUT:ケースノードのxmlノード&&データを同じデータで削除しますか?

<content> 
    <books> 
     <book> 
      <qty>21</qty> 
      <title>JAVA</title> 
     </book> 
    </books> 
</content> 

しかし、XMLは、このように同じデータが含まれている場合:それは、削除理由

<content> 
    <books> 
     <book> 
      <qty>21</qty> 
      <title>PHP</title> 
     </book> 
    </books> 
</content> 

$xml = '<books>  
      <book> 
       <qty>12</qty> 
       <title>C++</title> 
      </book> 
      <book> 
       <qty>21</qty> 
       <title>PHP</title> 
      </book>  
     </books>  
     <books>   
      <book> 
       <qty>21</qty> 
       <title>PHP</title> <!-- here the same data--> 
      </book>  
     </books>'; 

を、それが出力にこのような何かを取得する必要があります私のノードのすべて?と私は得た

<content> 
</content> 

答えて

1

削除しただけで最初の試合をしたい場合は、単に要素を検索するループにbreakを追加します。

# Remove elements based on qty and title 
foreach($arr as $items) { 
    foreach($items as $item) { 
     list($qty, $title) = explode(';', $item); 
     foreach($xpath->query('/content/books/book[title="'.$title.'"][qty="'.$qty.'"]') as $book) { 
      $book->parentNode->removeChild($book); 
      break; // <- Handle only the first match 
     } 
    } 
} 
+0

$編曲=配列( \t \t // 0 =>配列(の順序を'21; PHP ')、 \t \t 1 => array('21; PHP') \t);重要です – kn3l