Удаление узлов с недопустимыми именами тегов из XML-документа

Я преобразовываю xml с помощью процессора Saxon XSLT2 (используя Java + Saxon S9API) и имею дело с xml-документами в качестве источника, которые содержат недопустимые символы в качестве имен тегов и поэтому не могут быть проанализированы конструктором документов.

Пример:

<A>
   <B />
   <C>
      <D />
   </C>
   <E!_RANDOM_ />
   < />
</A>

Код:

import net.sf.saxon.s9api.*;

[...]

/* XSLT Processor & Compiler */
proc = new Processor(false);

/* build document from input*/
XdmNode source = proc.newDocumentBuilder().build(new StreamSource(input));

Ошибка:

Error on line X column Y 
SXXP0003: Error reported by XML parser: Element type
"E" must be followed by either attribute specifications, ">" or "/>".

восклицательный знак и имя тега, состоящее из пробела, в настоящее время являются моими единственными недействительными тегами. Я ищу более надежное решение, а не просто удаляю целые строки (отформатированного) xml.

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

Спасибо за помощь!


person Christian Tausch    schedule 25.04.2012    source источник


Ответы (1)


Если входные данные содержат недопустимые теги, это не XML. Лучше всего иметь правильное представление, ссылаясь на них как на не-XML-документы, а не как на XML-документы; это помогает прояснить, что для обработки документов, отличных от XML, вам нужны инструменты, отличные от XML. (Забудьте об «узлах» — узлов нет до тех пор, пока документ не будет проанализирован, и его нельзя проанализировать, пока вы не превратите его в правильно сформированный XML). Чтобы преобразовать не-XML в XML, вы, как правило, захотите использовать не-XML-инструменты, которые хороши для работы с текстом, такие как Perl. Конечно, гораздо лучше решить проблему у источника: все преимущества XML теряются, если люди генерируют данные в частных форматах, отличных от XML.

person Michael Kay    schedule 25.04.2012
comment
Определенно выход, который никогда не видел DOM-дерево. Пока я буду придерживаться своего хака, чтобы получить действительный xml. Спасибо, - person Christian Tausch; 27.04.2012