2009-08-06 2 views
2

Я хотел бы удалить определенные теги из документа XML как часть процесса фильтрации, но я не могу иначе изменить внешний вид или структуру XML.Фильтрация XML при сохранении его структуры

Входной XML поставляется в виде строки, например:

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <mytag myattr="123"/> 
    <mytag myattr="456"/> 
</main> 

и выход должен удалить mytag, где значение атрибута, скажем, 456:

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <mytag myattr="123"/> 
</main> 

дифференциал должен показать только удаленные теги как различия между входом и выходом.

Я просмотрел SAX, StAX и JAXB, но не похоже, что можно выводить XML в том же формате, который был введен с помощью любого из этих API. Вместо этого они сформируют хорошо структурированный XML с правильными отступом и пробелами, которые иногда будут отображаться в отличие от ввода.

Мой текущий метод использует регулярные выражения, но не очень надежный, поскольку он не учитывает все возможные способы структурирования вышеуказанного XML. Например, в соответствии со значением атрибута:

myAttr\s*=\s*"([^"]*)" 

Это работает на примере выше, но не будет срабатывать, этот XML-тег:

<mytag myattr= 
    123></mytag> 

регулярные выражения действительно лучший вариант в этой ситуации ?

ответ

5

Не используйте регулярные выражения для анализа XML! Вы уже знаете, что происходит, когда вы пытаетесь, и I have a spiel on why this is.

В вашем случае вы должны использовать XSLT. XSLT-файл, который вам нужен, очень прост и прост в использовании. Это в основном следующие:

<xsl:template match="mytag[@myattr=123]"> 
</xsl:template> 
<xsl:template match="*|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="*|@*" /> 
    </xsl:copy> 
</xsl:template> 

Какой будет копировать любой элемент, пока он не mytag с атрибутом myattr=123.

Я протестировал его на вашем примере файла и получил результат, который вы сказали, что хотите.

Теперь, как вы используете XSLT с Java, выглядит как an entire book has been written on the subject. Вероятно, вы можете использовать любую библиотеку XML, которая является вашей любимой. Я никогда раньше не использовал XSLT с Java, поэтому я не могу сказать вам, какая библиотека проще всего использовать.

+0

Я посмотрю на XSLT, но сохранит структуру входного XML. Примеры, которые я дал, были хорошо отформатированы, но представьте, что образец XML был в одной строке. Будет ли вывод также на одной линии? –

+0

@Alex Spurling: Этот * должен * быть абсолютно неактуальным, XML - это данные, а не формат сериализации. Почему это важно для вас? – Tomalak

+0

Потому что он использует инструменты, отличные от XML. –

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