2017-02-18 17 views
0

Я хочу удалить узел, если заголовок узла соответствует фильтру (массиву). Я использую unset(), и я уже пробовал $node и $item, но оба аргумента не удалят мой узел ...Удалить узел не работает с Simple XML (PHP)

Что не так в этом коде? - Я вхожу в условие if, потому что вижу в моей консоли in if!

$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->load("shop1.xml"); 
$pathXML = "/products/product"; 
$titleArray = array("Test", "Battlefield 1"); 


$doc = simplexml_import_dom($dom); 

$items = $doc->xpath($pathXML); 
foreach ($items as $item) { 
    $node = dom_import_simplexml($item); 
    $title = $node->getElementsByTagName('title')->item(0)->textContent; 
    echo $title . "\n"; 

    foreach ($titleArray as $titles) { 
     echo $titles . "\n"; 
     if (mb_stripos($title, $titles) !== false) { 
      echo "in if\n\n"; 
      unset($item); 
     } 
    } 
} 

$dom->saveXML(); 
$dom->save("shop1_2.xml"); 

XML файла:

<products> 
<product> 
    <title>Battlefield 1</title> 
    <url>https://www.google.de/</url> 
    <price>0.80</price> 
</product> 
<product> 
    <title>Battlefield 2</title> 
    <url>https://www.google.de/</url> 
    <price>180</price> 
</product> 
</products> 

Привет и спасибо!

ответ

1

Все, что вы делаете, это отключение локальной переменной. Вместо этого вы должны изменить DOM:?!

$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->load("shop1.xml"); 
$xpathQuery = "/products/product"; 
$titleArray = array("Test", "Battlefield 1"); 
$xp = new DomXpath($dom); 
$items = $xp->query($xpathQuery); 
foreach ($items as $item) { 
    $title = $item->getElementsByTagName('title')->item(0)->textContent; 
    echo "$title\n"; 
    if (in_array($title, $titleArray)) { 
     $item->parentNode->removeChild($item); 
    } 
} 
$dom->saveXML(); 
$dom->save("shop1_2.xml"); 
+0

Нет, не работает ... :(- Как я могу решить, что – Jan

+0

Попробуйте этот обновленный ответ ... – miken32

+0

Это работает - Спасибо, но у меня есть один вопрос: возможно ли использовать mb_stripos() instand in_array()? Я знаю, что in_array() работает быстрее, но я не могу сказать «игнорировать многобайтовый случай». Или есть способ использовать in_array() с " игнорировать многобайтовый случай?? – Jan