2016-08-31 31 views
0

我有一個XML文件,其註釋的文件底部有一個ID,我成功將NSLog「輸出」到控制檯。我使用NSXMLParser通過foundComment方法查找評論。然後在底部有一個GetUID方法,我想返回我的uid字符串。我不知道如何訪問我的分析數據,並在另一個單獨的方法中使用它。任何幫助將不勝感激。如何訪問分析的XML數據並在其他方法中使用它?

XML文件:

<audioTracks>0</audioTracks> 
<!--7934fad5a3a --> 

XMLParser.h

#import <Foundation/Foundation.h> 

@interface MyXmlParserDelegate : NSObject <NSXMLParserDelegate> 

@end 

XMLParser.mm

#import "XMLParser.h" 

@implementation MyXmlParserDelegate 

- (void) parserDidStartDocument:(NSXMLParser *)parser { 

} 

- (void)parser:(NSXMLParser *)parser 
foundComment:(NSString *)uid{ 

NSLog(@"UID: %@", uid); 

} 

- (void) parserDidEndDocument:(NSXMLParser *)parser { 

} 

@end 

MAIN.mm

-(NSString *)GetUID { 

     NSString * uid = nil; 

     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:MyData]; 

     MyXmlParserDelegate *parserDelegate = [[MyXmlParserDelegate alloc] init]; 
     [parser setDelegate:parserDelegate]; 


     [parser parse]; 

    return uid; 

}

回答

1

最佳答案取決於您需要解析器委託的可重用性。

如果MAIN對象是唯一的客戶,那麼您可以完全消除委託類,只需在GetUID中將self分配給您分配解析器的委託。

一個更普遍的想法是保持你的委託類,並把它具體地想象成一個「uid finder」。在這種形式下,它將包含一個在解析期間初始化的公共uid屬性。例如

// in the delegate 
- (void)parser:(NSXMLParser *)parser foundComment:(NSString *)uid { 
    NSLog(@"UID: %@", uid); 
    self.uid = uid; 
} 

// in the customer 
MyXmlParserDelegate *parserDelegate = [[MyXmlParserDelegate alloc] init]; 
parser.delegate = parserDelegate; 
[parser parse]; 

編輯

return parserDelegate.uid; 

我們可以得到更普遍的是,但正確的方法將更多地取決於你的模型和學位的性質將XML解析過程中需要泛化。

備註:習慣上命名類和源文件是相同的,所以MyXmlParserDelegate實現文件更好地命名爲「MyXmlParserDelegate.m」。另外,除非您的實現包含C++,否則它們應該具有「.m」擴展名。

+0

我試圖做你說的,但在行上返回parse.uid它會拋出一個錯誤,說「在對象類型NSXMLParser找不到的屬性uid」 – Nick

+0

我很抱歉,我很新的Objective-C。我覺得從另一種方法調用字符串不應該很難。這個錯誤對我來說仍然是一個殘缺。 – Nick

+1

這是我應該對不起。我建議的代碼包含錯誤。請參閱編輯。解析委託包含新屬性,而不是解析器。 – danh

相關問題