2009-09-13 19 views
0

從下面的XML我試圖檢索序列中的第二個元素。注意,結束節點與每個條目的開始部分相同,這使得它的檢索有點棘手。使用cocoa如何讓SAX在XML中區分endElements時它們是否相同?

我試着在startElementSAX函數中設置for循環來評估和拾取Width =「60」屬性。儘管這會正確地對數據進行排序,但仍然會導致目標屬性接收序列中的最後一個路徑。我認爲這是因爲爲了檢索節點的屬性,需要首先發現它。所以這也是每次發送。我一直無法找到一種隔離這種情況的方法。

我做了一個跟蹤,確認每次發送所有三條路徑,無論啓動條件如何。如果我能夠將它們附加到不同的屬性,這不會成爲問題。

如果你想看完整的項目,它在蘋果iPhone開發中心,名爲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; 

回答

0

您正在向XML應用任意附加含義;您已決定必須從< itms> ... </itms>元素列表中具有元素#2。由於文檔不會將特定元素稱爲任何不同/特殊的元素,因此您必須自己做。因此,你需要保持簿記的外部解析本身(因爲文檔中沒有任何內容表明#2與其餘部分不同)。

最簡單的方法是聲明一個全局變量...

unsigned int coverArtIndex; 

然後將其設置爲0,你開始解析一組項目之前。每當你打到你想要項目#2的標籤的開始時增加它,當它是2時,將你需要的數據抽出並存儲在某個地方。然後跳過其餘部分(不做任何事情,因爲處理SAX事件)。當你擊中組的結尾時,重置coverArtIndex。

+0

你是絕對正確的,coverArt需要增量索引。我不確定這是否應該在正在處理的SAX事件中完成。如果我正確地理解了你,我應該在SAX過程之外進行排序,並將它作爲預先格式化的SAX結構傳遞並最終重置索引? – Jim

相關問題