Фильтрация XML с сохранением его структуры - PullRequest
2 голосов
/ 06 августа 2009

Я бы хотел удалить некоторые теги из документа 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>

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

1 Ответ

5 голосов
/ 06 августа 2009

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

В вашем случае вы должны использовать 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, похоже, что была написана целая книга на эту тему . Вероятно, вы можете использовать любую библиотеку XML, которая вам нравится. Я никогда раньше не использовал XSLT с Java, поэтому не могу сказать, какую библиотеку проще всего использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...