2010-11-14 3 views
2

У меня есть задача, которая должна быть простой: удалите узлы и их потомки из XML-документа, оставив другие узлы.Удалить все элементы определенного типа из XML-документа с помощью PHP

Я попробовал этот код, но он не работает ...

$document->preserveWhiteSpace = false; 
$books = $xpath->query('piletilve_info/places'); 
//echo "4"; 

foreach ($books as $places) { 
    while($places->hasChildNodes()) { 
     $places->removeChild($places->childNodes->item(0)); 
    } 

    $places->parentNode->removeChild($places); 
} 

Источник XML для обработки:

<piletilve_info> 
    <places> 
     <place> 
     ... 
     </place> 
    </places> 
    <other node> 
     ... 
    </other node> 
</piletilve_info> 

В фактических данных есть несколько узлов, которые не являются местами , но для простоты в этом примере показано лишь несколько.

Я видел примеры C#, но мне не удается передать код на PHP.

Уточнение: в фрагменте кода переменная $books является держателем только для запрошенного списка. Имя не имеет значения.

+0

Обратите внимание, что «это не сработало» почти ничего не говорит. Вместо того, чтобы говорить нам, что что-то не делало то, что вы хотели, расскажите нам, что он сделал. Помимо этого, это хорошая запись: вы сообщаете нам, что вы хотите выполнить, и покажите [минимальный, но достаточно полный и репрезентативный пример кода] (http://sscce.org/) и данные, над которыми он работает. – outis

ответ

4

Цель заключается в удалении всего узла оставляя другие узлы (в фактическом там больше, но для простоты этого пример показывает все

$dom = new DOMDocument; 
$dom->load('places.xml'); 
foreach ($dom->getElementsByTagName('places') as $places) 
{ 
    $places->parentNode->removeChild($places); 
} 
echo $dom->saveXml(); 

удалит все <places> элементов в любом месте документа, в том числе любого дети

Выход:.

<?xml version="1.0"?> 
<piletilve_info> 

    <other> 
     ... 
    </other> 
</piletilve_info> 
+0

тестирование. ;) Спасибо за столь быстрый ответ :) –

+0

Так что не нужно использовать XPath для установки значения переменной, не так ли? –

+0

@HX вам нужен только XPath, если вам нужно запросить конкретные элементы. 'getElementsByTagName ('places')' в основном похож на '// places', поэтому он отличается от' piletilve_info/places', который только извлекает элемент places прямо под корневым узлом. Это зависит от того, что вы хотите получить. – Gordon

Смежные вопросы