Вложение SAX ContentHandlers

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

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

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

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

12.12.2008 16:41:58
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

4
18.04.2011 19:57:01

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

1
12.12.2008 17:07:20

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

0
12.12.2008 18:33:46