0

从下面的 XML 中,我试图检索序列中的第二个元素。请注意,结束节点与每个条目中的开始节点相同,这使其检索有点棘手。

我尝试在 startElementSAX 函数中设置一个 for 循环来评估和获取 Width="60" 属性。尽管这将正确地对数据进行排序,但它仍然会导致目标属性接收序列中的最后一条路径。我认为这是因为为了检索节点的属性,需要首先发现它。所以这也是每次都会发送的。我一直无法找到一种方法来避免这种情况发生。

我做了一个跟踪,确认每次都发送所有三个路径,而不管启动标准如何。如果我能够将它们附加到不同的属性,这将不是问题。

如果您想查看整个项目,它位于名为TopSongs的 Apple iPhone 开发中心。您可能需要密码。

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

1 回答 1

0

您正在对 XML 应用任意附加含义;您已决定必须从 <itms>...</itms> 元素列表中获得元素 #2。由于文档没有将该特定元素称为任何不同/特殊的元素,因此您将不得不自己做。

因此,您需要将执行此操作的簿记保留在解析本身的外部(因为文档中没有任何内容表明#2 与其余部分有任何不同)。

最简单的方法是声明一个全局变量...

unsigned int coverArtIndex;

然后在开始解析一组项目之前将其设置为 0。每次点击您想要项目 #2 的标签的开头时递增它,当它是 2 时,吸出您想要的数据并将其存储在某处。然后跳过其余的(在处理 SAX 事件时什么都不做)。当您到达组的末尾时,重置coverArtIndex。

于 2009-09-13T22:13:00.780 回答