Вложение SAX ContentHandlers - PullRequest
       11

Вложение SAX ContentHandlers

1 голос
/ 12 декабря 2008

Я хотел бы проанализировать документ с помощью SAX и создать вложенный документ из некоторых элементов, в то время как другие обрабатывались исключительно с помощью SAX. Итак, учитывая этот документ:

  <DOC>
    <small>
      <element />
    </small>
    <entries>
      <!-- thousands here -->
    </entries>
  </DOC>

Я хотел бы проанализировать элементы DOC и DOC / records с помощью SAX ContentHandler, но когда я нажимаю <small>, я хочу создать новый документ, содержащий только <small> и его дочерние элементы.

Есть ли простой способ сделать это, или я должен сам построить DOM вручную?

Ответы [ 3 ]

4 голосов
/ 12 декабря 2008

Один из подходов заключается в создании ContentHandler, который отслеживает события, сигнализирующие о входе или выходе из элемента <small>. Этот обработчик действует как прокси и в "нормальном" режиме передает события SAX прямо в "реальный" ContentHandler.

Однако, когда обнаружен вход в элемент <small>, прокси-сервер отвечает за создание TransformerHandler (с преобразованием no-op, «null»), отвес до DOMResult. TransformerHandler ожидает всех событий, которые мог бы произвести полный, правильно сформированный документ; Вы не можете немедленно отправить ему событие startElement. Вместо этого имитируйте начало нового документа, вызывая сначала setDocumentLocator, startDocument и другие необходимые события в экземпляре TransformerHandler.

Затем, до тех пор, пока прокси-сервер не обнаружит конец элемента <small>, все события перенаправляются на этот TransformerHandler вместо "реального" ContentHandler. Когда встречается закрывающий тег </small>, прокси-сервер имитирует конец документа, вызывая endDocument для TransformerHandler. DOM теперь доступен как результат TransformerHandler, который содержит только фрагмент <small />.

1 голос
/ 12 декабря 2008

Мне кажется, ответ зависит от того, нужен ли вам «новый документ» в памяти. Если вы затем используете DOM, или, если вы просто собираетесь транслировать «новый документ», StAX, вероятно, лучше соответствовал бы управляемой событиями природе SAX.

0 голосов
/ 12 декабря 2008

У меня не было проблем с созданием нескольких одновременных документов из одного потока SAX. Это в значительной степени СОП для любого потока, ориентированного на бизнес-документы. Какие у вас трудности с этим? Иерархия ваших классов не обязательно должна соответствовать иерархии потока SAX.

...