如何访问已解析的 XML 数据并在其他方法中使用它?
How can I access parsed XML data and use it in other methods?
我有一个 XML 文件,其中的注释在我的文件底部有一个 ID,表明我已成功将 NSLog"ing" 输出到控制台。我使用 NSXMLParser 通过 foundComment 方法查找评论。然后我在底部有一个 GetUID 方法,我想 return 我的 uid 字符串。我不确定如何访问我解析的数据并在另一个单独的方法中使用它。任何帮助将不胜感激。
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;
}
最佳答案取决于您需要的解析器委托的可重用性。
如果 MAIN 对象是唯一的客户,那么您可以完全消除委托 class,只需使 self
成为您在 GetUID
中分配解析器的委托。
一个更普遍的想法是保留您的代表 class,并将其具体视为 "uid finder"。在这种形式中,它将包含一个 public 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 解析过程需要泛化的程度。
旁注:习惯上将 classes 和源文件命名为相同的名称,因此 MyXmlParserDelegate
实现文件最好命名为 "MyXmlParserDelegate.m"。此外,除非您的实现包含 C++,否则它们应该具有“.m”扩展名。
我有一个 XML 文件,其中的注释在我的文件底部有一个 ID,表明我已成功将 NSLog"ing" 输出到控制台。我使用 NSXMLParser 通过 foundComment 方法查找评论。然后我在底部有一个 GetUID 方法,我想 return 我的 uid 字符串。我不确定如何访问我解析的数据并在另一个单独的方法中使用它。任何帮助将不胜感激。
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;
}
最佳答案取决于您需要的解析器委托的可重用性。
如果 MAIN 对象是唯一的客户,那么您可以完全消除委托 class,只需使 self
成为您在 GetUID
中分配解析器的委托。
一个更普遍的想法是保留您的代表 class,并将其具体视为 "uid finder"。在这种形式中,它将包含一个 public 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 解析过程需要泛化的程度。
旁注:习惯上将 classes 和源文件命名为相同的名称,因此 MyXmlParserDelegate
实现文件最好命名为 "MyXmlParserDelegate.m"。此外,除非您的实现包含 C++,否则它们应该具有“.m”扩展名。