SAX обнаруживает узлы на максимальной глубине

Как я могу отображать имена узлов с максимальной глубиной в дереве с SAX. Алгоритм мне подошел бы, чтобы понять концепцию ..

Например, что мне делать с методами starttelement, endelement, startdocument, enddocument и какие переменные мне нужны для выполнения задачи?

Спасибо!


person Ataman    schedule 15.05.2012    source источник


Ответы (1)


Это скорее алгоритмическая проблема. Чтобы решить эту проблему, следует отметить, что каждый раз, когда у вас есть стартовое событие, вы переходите на один уровень вниз, а когда у вас есть событие endelement, вы переходите на один уровень вверх. Идея состоит в том, чтобы иметь переменную (уровень) и для каждого стартового элемента увеличивать ее (уровень ++) и для каждого конечного элемента уменьшать ее (уровень -). Это означает, что при нахождении endelement для узла значением переменной уровня будет глубина узла. Тогда единственное, что вам нужно сделать, это просто следить за максимумом. Версия псевдокода будет такой:

 startdocument -> level=0;max=0;
 startelement  -> level++
 endelement    -> if (level>max) max=level; level--; 
 endocument    -> System.out.println(max)

Надеюсь, поможет.

person Mircea    schedule 15.05.2012
comment
Спасибо, это действительно помогло. Но это напечатает максимальную глубину в виде числа. Чтобы отобразить самые глубокие узлы. Я думаю, я могу иметь 2-мерный массив или хэш-список и хранить имя и уровень узла в endelement, а затем выбрать максимальный уровень с именами узлов в конечном документе ... как вы думаете, будет ли это правильно? - person Ataman; 15.05.2012
comment
Похоже, хороший план. На вашем месте я бы не отслеживал узлы и уровни, я бы сначала нашел максимальную глубину, а затем снова просмотрел бы xml, используя синтаксический анализатор sax и переменную уровня, и где level == max я бы распечатал узел. - person Mircea; 15.05.2012
comment
Сохраните набор имен узлов на максимальной глубине. Когда вы найдете новый максимум (уровень ›max), очистите набор, а затем добавьте имя этого узла. Когда вы найдете новый узел на той же глубине, что и max (level = max), добавьте имя этого узла в набор. - person Michael Kay; 15.05.2012