Создание всего DOM для этого довольно излишне. У вас в памяти будет все дерево XML, которое может быть довольно тяжелым для больших документов. Я предлагаю одно из следующего:
- Разбор с SAX или StAX, просто копирование материала на вывод, если вы не хотите, чтобы он отфильтровывался.
- Примените XSLT-преобразование, которое копирует все по умолчанию, но имеет один или несколько шаблонов, которые ничего не делают со своим вводом, таким образом, отфильтровывая его.
Вариант 2 - самый простой, и, по моему опыту, XSLT в Java быстр и экономит память, особенно для такого простого варианта использования, как этот.
Эти два шаблона будут вам нужны:
Копия по умолчанию
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/><xsl:copy>
</xsl:template>
«Фильтр»:
<xsl:template match="//*[your predicate here]">
<!-- Don't do a thing -->
</xsl:template>
РЕДАКТИРОВАТЬ: Я только что заметил, что вы не просто отфильтровывать конкретные имена, но те, которые соответствуют регулярному выражению. Функции XPath может быть достаточно, чтобы предикат выбирал целевые узлы. Но при необходимости функции Java String можно использовать в XSLT через расширение. Это действительно делает это решение немного более сложным, но все же стоит того, чтобы взять анализ XML из ваших рук.