2012-06-12 4 views
0

Я пытаюсь выполнить следующее:DOM4J: саксофон разбор загруженного документа

  1. нагрузки документа (сделано)
  2. идет корыта глубины документа первыми и использовать DefaultHandler из JDK, чтобы сделать некоторую работу

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

Обратите внимание, что это полезно следующим образом: я должен использовать обработчик несколько раз. Для больших документов я хочу использовать SAX, для небольших я хочу использовать внутреннее представление.

Спасибо!

ответ

1

Самый быстрый способ (быстрая кодировка), чтобы выполнить это, заключается в том, чтобы написать часть внутреннего документа, которую вы хотите проанализировать с помощью SAX во внутреннюю строку, а затем с помощью StringReader на основе этой строки передать это SAX, используя ваш обработчик.

Вам действительно нужно создавать события SAX на основе ваших данных и передавать эти события обработчику. Вы можете сделать это, получив данные в форме InputSource или Reader, а затем используя это в своем анализе, которое является тактикой, описанной выше, или вы можете просто имитировать события SAX, напрямую вызывая методы ContentHandler, которые вы используете уже написано. Но называя их в правильном порядке и подавая им правильные данные для достижения того, что вам нужно, может быть болезненным, если ваш документ вообще сложный.

Если Dom4J предоставляет способ создания InputSource на основе узла в структуре документа, это будет проще всего использовать и, вероятно, гораздо эффективнее, чем сначала записать его в строку.

Возможно, вам стоит рассмотреть возможность извлечения частей вашего ContentHandler, которые выполняют фактическую работу в отдельный класс, который вы можете использовать как из ContentHandler, так и из нового класса, который перемещается по внутреннему дереву.

+0

Но это было бы очень медленно, нет? – Xaero182

+0

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

+0

Thats true. Я мог бы добавить несколько обработчиков и сделать больше вещей параллельно. Я думаю, что я собираюсь извлечь часть ContentHandler, выполняя эту работу, как вы предлагаете. Благодаря! – Xaero182

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