Usando cacau como faço para obter SAX para distinguir endElements em XML quando eles são o mesmo?

StackOverflow https://stackoverflow.com/questions/1418621

Pergunta

A partir do XML abaixo eu estou tentando recuperar o segundo elemento na sequência. Observe o nó final é o mesmo que o início em cada entrada, este está a fazer a sua recuperação de um pouco complicado.

Eu tentei configurar um loop na função startElementSAX para avaliar e pick-up Largura = atributo "60". Embora este irá classificar os dados corretamente, ainda resulta na propriedade alvo receber o último caminho na seqüência. Eu presumo que é porque a fim de recuperar o atributo para o nó que precisa ser descoberto pela primeira vez. Então, isso também está sendo enviada a cada vez. Eu não tenho sido capaz de encontrar uma maneira de isolar isso aconteça.

Eu fiz um traço que confirma todos os três caminhos são enviados a cada momento, independentemente dos critérios de início. Isto não seria um problema se eu era capaz de ser anexá-los a diferentes propriedades.

Se você quiser olhar para o projeto em sua totalidade é no iPhone Dev Center da Apple chamado TopSongs . Você pode precisar de uma senha.

<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>  

Este é o código endElement eu tenho até agora.

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;
Foi útil?

Solução

Você está aplicando um significado adicional arbitrário ao XML; você decidiu que você deve ter elemento # 2 da lista de ... elementos. Como o documento não chama aquele elemento em particular como algo diferente / especial, você vai ter que fazê-lo sozinho.

Assim, você vai precisar para manter a contabilidade para fazer isso para externamente à análise em si (uma vez que não há nada no documento para indicar que # 2 é diferente do que o resto).

A maneira mais fácil é declarar uma variável global ...

unsigned int coverArtIndex;

Em seguida, configurá-lo para 0 antes de começar a analisar um grupo de itens. Incrementá-lo cada vez que você acertar o início da tag para o qual deseja item 2 e, quando é 2, sugar os dados que você quer e armazená-lo em algum lugar. Em seguida, basta ignorar o resto (não fazer nada como os eventos SAX são processados). Quando você atinge o fim do grupo, redefinir coverArtIndex.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top