Регулярные выражения XML notepad++ Как удалить блок offer, если внутри есть определенное значение (available="false")?
Нужно удалить все блоки (всё что между тегами <offer включая сами теги, при условии что между этими тегами есть значение available="false" Для того, чтобы удалить все карточки товаров из файла которых нет в наличии.
<offer id="6136DS" available="true">
<name>Название товара</name>
<description>Описание товара </description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>7.9</price>
<quantity_in_stock>8</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503690</vendorCode>
<param name="Каталог">2022</param>
<param name="Цвет"/>
<param name="Материал">материал</param>
<param name="Размер"/>
</offer>
<offer id="6138DS" available="false">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>5.9</price>
<quantity_in_stock>0</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503789</vendorCode>
<param name="Каталог"/>
<param name="Цвет"/>
<param name="Материал">Материал</param>
<param name="Размер"/>
</offer>
<offer id="6140DS" available="true">
<name>Название товара</name>
<description>Описание товара </description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>7.5</price>
<quantity_in_stock>11</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503800</vendorCode>
<param name="Каталог">2022</param>
<param name="Цвет"/>
<param name="Материал">Материал</param>
<param name="Размер"/>
</offer>
<offer id="6142DS" available="false">
<name>Название товара</name>
<description>Описание товара </description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>10.9</price>
<available/>
<quantity_in_stock>0</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>502790</vendorCode>
<param name="Каталог">12/13</param>
<param name="Цвет"/>
<param name="Материал"/>
<param name="Размер"/>
</offer>
Ответы (2 шт):
Вот решение на основе XSLT.
Оно использует так называемый Identity Transform pattern.
Один единственный шаблон (template) удаляет ненужные offers.
Начальный XML
<?xml version="1.0" encoding="utf-8"?>
<root>
<offer id="6136DS" available="true">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>7.9</price>
<quantity_in_stock>8</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503690</vendorCode>
<param name="Каталог">2022</param>
<param name="Цвет"/>
<param name="Материал">материал</param>
<param name="Размер"/>
</offer>
<offer id="6138DS" available="false">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>5.9</price>
<quantity_in_stock>0</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503789</vendorCode>
<param name="Каталог"/>
<param name="Цвет"/>
<param name="Материал">Материал</param>
<param name="Размер"/>
</offer>
<offer id="6140DS" available="true">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>7.5</price>
<quantity_in_stock>11</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503800</vendorCode>
<param name="Каталог">2022</param>
<param name="Цвет"/>
<param name="Материал">Материал</param>
<param name="Размер"/>
</offer>
<offer id="6142DS" available="false">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>10.9</price>
<available/>
<quantity_in_stock>0</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>502790</vendorCode>
<param name="Каталог">12/13</param>
<param name="Цвет"/>
<param name="Материал"/>
<param name="Размер"/>
</offer>
</root>
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="offer[@available='false']"/>
</xsl:stylesheet>
Результат
<?xml version='1.0' encoding='UTF-8' ?>
<root>
<offer id="6136DS" available="true">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>7.9</price>
<quantity_in_stock>8</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503690</vendorCode>
<param name="Каталог">2022</param>
<param name="Цвет"/>
<param name="Материал">материал</param>
<param name="Размер"/>
</offer>
<offer id="6140DS" available="true">
<name>Название товара</name>
<description>Описание товара</description>
<currencyId>EUR</currencyId>
<categoryId>6039</categoryId>
<picture>Ссылка на картинку</picture>
<price>7.5</price>
<quantity_in_stock>11</quantity_in_stock>
<vendor>Бренд</vendor>
<vendorCode>503800</vendorCode>
<param name="Каталог">2022</param>
<param name="Цвет"/>
<param name="Материал">Материал</param>
<param name="Размер"/>
</offer>
</root>
Регулярное выражение:
<offer[^>]*?(?=available="false").*?</offer>\s*
Устанавливается в поле Найти: в notepad: ctrl + h
Заменить на: оставляем пустым
Устанавливаем параметры:
- Зациклить поиск
- Регулярное выражение
- И новые строки
Нажимаем заменить всё
Немного подробнее о выражении:
<offer[^>]*?(?=available="false") - в открытом теге находим признак для удаления
.*?</offer>\s* - в случае успеха предыдущей части выбираем все до закрытия тега плюс ноль и более переносов строк и пробельных символы после него
