Извлечь строку из файла XML? (С использованием TBXML) - PullRequest
0 голосов
/ 06 июня 2011

Нет проблем с чтением и загрузкой, но я не уверен насчет синтаксиса для получения строки из определенного места.

Например, с этим XML ...

<stories>
  <story ID="01" name="Story 1">
    <scenes>
      <scene ID="01" name="Scene 1">
        <pages>
          <page ID="01">
            <charName>
              n010101
            </charName>
            <charTalk>
              s010101
            </charTalk>
          </page>
        </pages>
      </scene>
    </scenes>
  </story>
</stories>

Как бы я сказал ...
"от charName на странице с ID 01 на страницах в сцене с ID 01 в сценах в истории с ID 01 в рассказах"

Как путь, это было бы что-токак:
stories > story 01 > scenes > scene 01 > pages > page 01 > charName

Я смотрел на другие проекты, которые реализуют TBXML, но я не могу найти то, что я ищу.
(Я тоже очень плохо смотрючерез чужой исходный код, так что я, вероятно, сталкивался с ним не раз.)

Мой loadStories метод на Pastebin

Редактировать:Интересно ... Что быстрее, TBXML или plist, и для чего проще кодировать?
Они оба полностью загружены в память, поэтому все сводится к количеству строк, читаемости и времени разбора.

...
Все еще жду ответа.Я не возражаю переключиться на NSXMLParser, если кто-то может бросить мне хороший (полезный) учебник, но TBXML намного легче, даже если у него немного больше места с огромными файлами.
Сколько нужно для TBXMLв любом случае, стать тяжелым?

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Я искал документ в виде строки, и TBXML его не поддерживает.В итоге я добавил свойство в класс TBXML xmlString и сохранил строку, прочитанную из URL.

- (id)initWithURL:(NSURL*)aURL 
{
    self.xmlString = [NSString stringWithContentsOfURL:aURL encoding:NSUTF8StringEncoding error:nil];

    self = [self initWithXMLString:self.xmlString];
    if (self != nil) {
    }
    return self;
}
0 голосов
/ 05 июля 2012

XML имеет колоссальные накладные расходы, которые могут мгновенно стать ужасно неэффективными.

Списки свойств достаточно просты в обращении, и нетрудно преобразовать содержимое в необработанные данные.
NSJSON не самый быстрый, но он поддерживает ARC и намного проще в реализации.


Да, я знаю, что на самом деле не решил проблему.Этот ответ для более простого и значительно лучшего решения.

0 голосов
/ 07 июня 2011

Насколько я могу судить, TBXML не имеет API для того, что вы хотите делать. Вам придется самостоятельно кодировать навигацию по дереву XML. Если у вас есть только один или два типа запросов, это не должно быть слишком страшно. libxml поддерживает XPath, так что вы можете использовать его, если вам нужно выполнять различные типы запросов к XML во время выполнения.

Поскольку вы уже загружаете все истории из XML в объекты модели, вам, вероятно, будет проще и быстрее работать с объектами модели и сохранять и загружать только из XML. Это также позволяет вам избавиться от проанализированных XML-данных помимо того, что нужно вашей модели во время выполнения, вместо того, чтобы хранить два разных представления бесконечно.

Что касается списков в сравнении с XML: при условии, что вы используете типы данных, удобные для списков, загрузка и сохранение с помощью списков намного проще, поскольку вся эта работа по восстановлению сделана для вас. Но поскольку вы используете классы моделей, а не необработанные коллекции NSArray / NSDictionary, вы, скорее всего, не увидите большой выгоды по сравнению с использованием TBXML.

Одна вещь, которая упростила бы ваш код, - это чтобы объекты знали, как создавать себя, учитывая соответствующий объект TBXML. Вместо массивного loadStories метода, который знает все о всей иерархии данных, вы должны загрузить XML-документ и передать его инициализатору Story, который, чтобы инициализировать его сцены, передаст документ (и соответствующий родительский элемент) в инициализатор сцены, который позаботится о создании своих дочерних элементов и в дальнейшем. Каждый класс затем заботится о том, чтобы убедиться, что он инициализирован, а изменения в иерархии в конечном итоге локализованы в одном классе, а не в этих бог-методах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...