Насколько я могу судить, TBXML не имеет API для того, что вы хотите делать. Вам придется самостоятельно кодировать навигацию по дереву XML. Если у вас есть только один или два типа запросов, это не должно быть слишком страшно. libxml
поддерживает XPath, так что вы можете использовать его, если вам нужно выполнять различные типы запросов к XML во время выполнения.
Поскольку вы уже загружаете все истории из XML в объекты модели, вам, вероятно, будет проще и быстрее работать с объектами модели и сохранять и загружать только из XML. Это также позволяет вам избавиться от проанализированных XML-данных помимо того, что нужно вашей модели во время выполнения, вместо того, чтобы хранить два разных представления бесконечно.
Что касается списков в сравнении с XML: при условии, что вы используете типы данных, удобные для списков, загрузка и сохранение с помощью списков намного проще, поскольку вся эта работа по восстановлению сделана для вас. Но поскольку вы используете классы моделей, а не необработанные коллекции NSArray
/ NSDictionary
, вы, скорее всего, не увидите большой выгоды по сравнению с использованием TBXML.
Одна вещь, которая упростила бы ваш код, - это чтобы объекты знали, как создавать себя, учитывая соответствующий объект TBXML. Вместо массивного loadStories
метода, который знает все о всей иерархии данных, вы должны загрузить XML-документ и передать его инициализатору Story, который, чтобы инициализировать его сцены, передаст документ (и соответствующий родительский элемент) в инициализатор сцены, который позаботится о создании своих дочерних элементов и в дальнейшем. Каждый класс затем заботится о том, чтобы убедиться, что он инициализирован, а изменения в иерархии в конечном итоге локализованы в одном классе, а не в этих бог-методах.