Согласившись с мнением о том, что экспорт объекта в XML является нарушением инкапсуляции, фактическая технология, используемая для обработки тегов, которые вложены с различной длиной, не очень сложна при использовании SAX.
По сути, сохранитьStringBuffer, который будет поддерживать ваше «местоположение» в документе, который будет каталогом, похожим на представление вложенного тега, в котором вы находитесь в данный момент.Например, если на данный момент содержимое строкового буфера равно /library/book/img/url
, то вы знаете, что это URL-адрес изображения в книге, а не URL-адрес какой-либо категории.
После того, как вы убедитесь, что ваше "отслеживание пути""алгоритмы верны, вы можете затем обернуть свои процедуры создания объектов с лучшей обработкой, используя совпадения строк.Вместо
if ("url".equalsIgnoreCase(qName)) {
...
}
теперь вы можете заменить
if (location.equalsIgnoreCase("/library/book/img/url")) {
...
}
Если по какой-то причине вам это не нравится, есть и другие решения.Например, вы можете создать обработчик SAX, который реализует стек обработчиков, где верхний обработчик отвечает за обработку только своей части XML-документа, и он извлекает себя из стека, как только это будет сделано.Используя такую схему, каждый объект создается своим собственным уникальным индивидуальным обработчиком, и некоторые обработчики в основном проверяют и направляют, какие обработчики «создания объекта» помещаются в стек обработки в соответствующее время.
Я имеюиспользовал обе техники.В обоих есть свои сильные стороны, и какой из них лучше всего зависит от ввода и необходимых объектов.