2010-12-11 58 views
1

我仍然在解析一個XML文件時環顧我的腦海。目前我正在使用TBXML從XML文件獲取信息。在XML中訪問子項?

以下是我從不同的XML文件中得到了一些數據:

TBXML  *XML = [[TBXML tbxmlWithURL:[NSURL URLWithString:locationString]] retain]; 
TBXMLElement *rootXML = XML.rootXMLElement; 
TBXMLElement *e = [TBXML childElementNamed:@"Result" parentElement:rootXML]; 
TBXMLElement *WOEID = [TBXML childElementNamed:@"woeid" parentElement:e]; 
NSString  *woeid = [TBXML textForElement:WOEID]; 

它工作的罰款。

但是,現在我想從這個例子中獲取雅虎RSS XML文件的溫度。

http://weather.yahooapis.com/forecastrss?w=12700023

我不知道如何訪問一個包含天氣行。我如何使用TBXML來做到這一點?

謝謝!

回答

3

由於TBXML只允許您訪問子項,您必須走樹才能找到您想要的元素,基本上就像您在示例代碼中那樣。一般來說,如果有多個具有給定節點名稱的子節點,則需要循環。如果您只需要第一個,則可以使用if-else語句而不是循環。

TBXML  *XML = [[TBXML tbxmlWithURL:[NSURL URLWithString:locationString]] retain]; 
TBXMLElement *rss = XML.rootXMLElement, 
      *channel, 
      *units, 
      *item, 
      *condition; 
NSString  *temperatureUnits, 
      *temperature; 

for (channel = [TBXML childElementNamed:@"channel" parentElement:rss]; 
    channel; 
    channel = [TBXML nextSiblingNamed:@"channel" searchFromElement:channel]) 
{ 
    for (units = [TBXML childElementNamed:@"units" parentElement:channel]; 
     units; 
     units = [TBXML nextSiblingNamed:@"units" searchFromElement:units]) 
    { 
     if ((temperatureUnits = [TBXML valueOfAttributeNamed:@"temperature" forElement:units])) { 
      [temperatureUnits retain]; 
      break; 
     } 
    } 
    for (item = [TBXML childElementNamed:@"item" parentElement:channel]; 
     item; 
     item = [TBXML nextSiblingNamed:@"item" searchFromElement:item]) 
    { 
     for (condition = [TBXML childElementNamed:@"yweather:condition" parentElement:item]; 
      condition; 
      condition = [TBXML nextSiblingNamed:@"yweather:condition" searchFromElement:condition]) 
     { 
      temperature = [TBXML valueOfAttributeNamed:@"temp" forElement:condition]; 
      // do something with the temperature 
     } 
    } 
    [temperatureUnits release]; 
    temperatureUnits = nil; 
} 

如果你不想來處理迴路的溫度,將它們添加到某種類型的集合(可能是一個NSMutableArray)。

+0

它的工作原理,雖然調用'[溫度單位發佈];'它崩潰的應用程序。也許它是零。我開始認爲使用TBXML是一個壞主意,我應該堅持使用默認的NSXML嗎? – 2010-12-12 05:30:41

+1

實際上,這是因爲'temperatureUnits' *不是*零(零忽略消息)。已經很晚了,我把自己搞糊塗了,認爲「溫度單位」正在循環。 「溫度單位」的「保留」/「釋放」並不是嚴格意義上的必要。原本,我正朝着另一個方向前進。通過將'temperatureUnits'設置爲釋放後(如更新後的答案)或刪除'retain'&'release'來修復它。 – outis 2010-12-12 11:36:03

+0

我會用'NSXML',因爲它支持[XPath和XQuery](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/NSXML_Concepts/Articles/QueryingXML.html#//apple_ref/doc/uid/TP40001258-CJBFCGEG),所以你可以直接訪問你想要的節點。 – outis 2010-12-12 11:39:23