Если вам нужно отфильтровать весь документ, тогда XPath - это путь. Проблема в том, что SimpleXML не может удалить произвольные узлы, подобные этой, поэтому вам нужно преобразовать их в DOM , а затем использовать parentNode-> removeChild ()
Я поддерживаю библиотеку, которая делает подобные вещи, SimpleDOM . Вот как я это сделаю:
include 'SimpleDOM.php';
$tab = simpledom_load_string(
'<tab context="new_item,edit_item">
<input type="text" context="new_item" />
<input type="readonly" context="edit_item" />
<tab context="new_item">
...
</tab>
</tab>'
);
$context = 'new_item';
// will match ",new_item," to ",new_item,edit_item,"
$tab->deleteNodes('//*[contains(concat(",", @context, ","), ",' . $context . ',")]');
echo $tab->asXML();
Обратите внимание, что не удалит корневой узел, так как это сделает документ недействительным. Если вы не хотите зависеть от внешней библиотеки, не стесняйтесь взглянуть на исходный код и скопировать / вставить то, что вам нужно.
Примечание о выражении XPath: если значения разделены запятыми, убедитесь, что нет ничего, кроме запятых (без пробелов), и заключите между запятыми как значение атрибута, так и значение, которому вы соответствуете.