Наилучший способ парсинга XML с использованием SAX (на данный момент) - использование стека и условных операторов в соответствующих обратных вызовах. Вот статья, описывающая это , и мое краткое изложение этого:
Основная предпосылка заключается в том, что когда вы анализируете документ, вы создаете объекты для хранения проанализированных данных, помещая их в стек по мере необходимости, просматривая верхнюю часть стека, чтобы добавить данные к текущему элементу, и на конец каждого элемента выталкивает его из стека и сохраняет его в родительском элементе.
В результате вы сначала анализируете дерево глубины элементов, а в конце каждой ветви вы откатываете его обратно к родительскому элементу, пока не останетесь с единственным объектом (таким как ConnectionList), который содержит все проанализированные данные готовы к использованию. По сути, вы получаете серию объектов, которые отражают структуру исходного XML
Это означает, что вам нужны некоторые объекты данных, которые могут хранить данные в той же структуре, что и XML. Сложные элементы обычно становятся классами, в то время как простые элементы обычно являются атрибутами внутри классов. Корневой элемент часто представлен каким-то списком.
Для начала вы создаете объект стека для хранения данных при их разборе.
Затем в начале каждого элемента вы определяете тип используемого им метода localName.equals()
, создаете экземпляр соответствующего класса и помещаете его в стек. Если элемент является простым элементом, вы, вероятно, будете смоделировать его как атрибут в классе, представляющем родительский элемент, и вам понадобится серия флагов, которые сообщают парсеру, встречается ли такой элемент и что это за элемент. обрабатываться в методе characters()
.
Фактические данные читаются с использованием метода characters()
, и вы снова используете условную логику, чтобы определить, что делать с данными, основываясь на значении флага. По сути, вы заглядываете на вершину стека и используете соответствующий метод для записи данных в объект, преобразовывая из текста, где это необходимо.
В конце каждого элемента вы открываете верх стека и снова используете localName.equals()
, чтобы определить, как сохранить его в объекте перед ним (например, какой метод установки необходимо вызвать)
Когда вы дойдете до конца документа, вы должны были собрать все данные в документе.