2010-12-11 3 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

'[temperatureUnits release];를 호출하면 작동하지만 앱이 다운됩니다. 아마도 그것은 0입니다. TBXML을 사용하는 것이 좋지 않다고 생각하기 시작했습니다. 기본 NSXML을 사용해야합니까? –

+1

사실, 'temperatureUnits' *가 * nil (nil은 메시지를 무시)이 아니기 때문입니다. 그것은 늦었고, 나는'temperatureUnits'가 반복되고 있다고 생각하는 것에 혼란스러워했다. 'temperatureUnits'의'retain' /'release'는 엄밀히 말해서 꼭 필요한 것은 아닙니다. 나는 원래 그것과 다른 방향으로 가고 있었다. release 후 (update 대답처럼)'temperatureUnits'를 nil로 설정하거나'retain'과'release'를 삭제하여 문제를 해결하십시오. – outis

+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

관련 문제