Usando cacau como faço para obter SAX para distinguir endElements em XML quando eles são o mesmo?
-
07-07-2019 - |
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;
Solução
Você está aplicando um significado adicional arbitrário ao XML; você decidiu que você deve ter elemento # 2 da lista de
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.