Используя какао, как мне получить SAX, чтобы различать конечные элементы в XML, когда они одинаковые? - PullRequest
0 голосов
/ 13 сентября 2009

Из приведенного ниже XML я пытаюсь получить второй элемент в последовательности. Обратите внимание, что конечный узел совпадает с началом в каждой записи, что делает его поиск немного сложным.

Я попытался установить цикл for в функции startElementSAX, чтобы оценить и подобрать атрибут Width = "60". Хотя это будет правильно сортировать данные, это все равно приведет к тому, что целевое свойство получит последний путь в последовательности. Я предполагаю, что это потому, что для получения атрибута для узла его нужно обнаружить в первую очередь. Так что это также отправляется каждый раз. Я не смог найти способ изолировать это от происходящего.

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

Если вы хотите посмотреть на проект целиком, он находится в Apple iPhone Dev Center под названием TopSongs . Вам может понадобиться пароль.

<itms:coverArt height="53" width="53">http://a1.phobos.apple.com/us/r1000/030/Music/7f/b0/f6/mzi.erhtxklr.53x53-50.jpg</itms:coverArt>
<itms:coverArt height="60" width="60">http://a1.phobos.apple.com/us/r1000/030/Music/7f/b0/f6/mzi.erhtxklr.60x60-50.jpg</itms:coverArt>
<itms:coverArt height="100" width="100">http://a1.phobos.apple.com/us/r1000/030/Music/7f/b0/f6/mzi.erhtxklr.100x100-75.jpg</itms:coverArt>  

Это код endElement, который у меня есть.

static void endElementSAX(void *parsingContext, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI) {    
iTunesRSSImporter *importer = (iTunesRSSImporter *)parsingContext;
if (importer.parsingASong == NO) return;
} else if (!strncmp((const char *)prefix, kName_Itms, kLength_Itms)) {
if (!strncmp((const char *)localname, kName_CoverArt, kLength_CoverArt)) {
importer.currentSong.coverArt60 = importer.currentString;

1 Ответ

0 голосов
/ 14 сентября 2009

Вы применяете произвольное дополнительное значение к XML; вы решили, что у вас должен быть элемент № 2 из списка ... элементов. Поскольку документ не вызывает этот конкретный элемент как что-либо другое / особенное, вам придется сделать это самостоятельно.

Таким образом, вам нужно сохранить бухгалтерию, чтобы сделать это внешне для самого анализа (поскольку в документе нет ничего, что указывало бы, что # 2 отличается от остальных).

Самый простой способ - объявить глобальную переменную ...

unsigned int coverArtIndex;

Затем установите его в 0, прежде чем начинать анализ группы элементов. Увеличивайте его каждый раз, когда вы нажимаете начало тега, для которого вы хотите элемент № 2, и, когда оно равно 2, высасываете нужные данные и сохраняете их где-нибудь. Затем просто пропустите остальное (ничего не делайте, поскольку обрабатываются события SAX). Когда вы дойдете до конца группы, сбросьте coverArtIndex.

...