Проверка нескольких тегов с помощью SAXParser - PullRequest
1 голос
/ 02 декабря 2011

Я не знаю, как правильно сформулировать этот вопрос, но я покажу пример.

enter image description here

Предположим, я хочу узнать атрибут type тега block Я мог бы просто

 if (localName == "block") {

    int type = Integer.parseInt(attributes.getValue("type));

Однако у меня также есть другие файлы, которыеОпишите сам блочный тип, который использует теги в качестве базовых тегов.Я должен знать, является ли атрибут дочерним от ОБА (Уровень / Тип блока) И блока.Или, может быть, если он находится под LevelArray и Block.

Надеюсь, у меня есть какой-то смысл, я не слишком разбираюсь в Xml / xmlparsing.

-Как искать атрибуты элементов, вложенных в другие элементы?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Если я вас правильно понимаю, то, похоже, ваша проблема в том, что способ обработки атрибута type на самом деле зависит от структуры фактического узла; другими словами, способ обработки атрибута type зависит от того, имеет ли элемент block родительский элемент 'LevelArray' или сам block является корневым элементом документа.

В этой ситуации я думаю, что вам нужно реализовать свой собственный простой конечный автомат для обратных вызовов SAX. Другими словами, имейте некоторые переменные, которые отслеживают, какие элементы уже были открыты и закрыты, поскольку анализатор SAX пересекает файл XML. Это было бы очень просто.

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

0 голосов
/ 02 декабря 2011

Вы должны следить за состоянием на ходу.Например, вы можете иметь переменную экземпляра с именем inBlockTag, которая изначально равна false.В методе startElement, если localName.equals("block"), вы можете установить для inBlockTag значение true.Затем, когда вы обрабатываете другие элементы, вы можете проверить значение этого флага, чтобы узнать, являетесь ли вы дочерним элементом блока или нет.Если вы сделаете это, не забудьте установить значение false в методе endElement (опять же, когда localName.equals("block")).

...