我已经在今天早些时候编写了一个简单的NSXMLParser示例,所以我只是把它解释为您所描述的XML。
工作示例项目位置:https://github.com/erikt/ETParseIntuitSOExample
的的NSXMLParser委托是你问什么。这里的标题:
#import <Foundation/Foundation.h>
@interface ETIntuitParser : NSObject<NSXMLParserDelegate>
+ (NSDictionary *)parseIntuitXML:(NSString *)xml;
@end
和实现:
#import "ETIntuitParser.h"
@interface ETIntuitParser()
@property NSUInteger dataColNumber;
@property (copy,nonatomic) NSString *dataKey;
@property (strong,nonatomic) NSMutableString *currentElementValue;
@property (strong,nonatomic) NSMutableDictionary *resultDict;
@end
@implementation ETIntuitParser
+ (NSDictionary *)parseIntuitXML:(NSString *)xml {
ETIntuitParser *intuitParser = [[ETIntuitParser alloc] init];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
[xmlParser setDelegate:intuitParser];
BOOL success = [xmlParser parse];
if (success) {
return [NSDictionary dictionaryWithDictionary:intuitParser.resultDict];
} else {
NSLog(@"Error parsing login information");
return nil;
}
}
#pragma mark - NSXMLParserDelegate
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"Report"]) {
if (!self.resultDict) {
self.resultDict = [NSMutableDictionary dictionary];
}
return;
}
}
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!self.currentElementValue) {
self.currentElementValue = [[NSMutableString alloc] initWithString:string];
} else {
[self.currentElementValue appendString:string];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"DataRow"]) {
self.dataColNumber = 0;
}
if ([elementName isEqualToString:@"ColData"]) {
NSString *trimmedValue = [self.currentElementValue stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (self.dataColNumber == 0) {
self.dataKey = trimmedValue;
self.dataColNumber++;
} else {
[self.resultDict setObject:trimmedValue forKey:self.dataKey];
}
}
self.currentElementValue = nil;
}
@end
我刚打印出来所产生的字典中的NSLog(在viewDidLoad中的视图控制器毫不逊色......),结果是:
2012-11-07 00:21:22.409 ETParseIntuitSOExample[66941:c07] {
"Accounts Payable" = 653653;
"Accounts Receivable" = 674532;
"Checking/Savings" = 12345345;
Equity = 45363;
"Fixed Assets" = 63545534;
"Long Term Liabilities" = "553797.26";
"Other Assets" = 325465;
"Other Current Assets" = 423546;
"Other Current Liabilities" = "910596.75";
}
我不知道,如果你需要从XML结构中的列标头信息,但应该是很容易为你添加。
究竟是什么问题?您是要求我们制作XML结构的一部分还是如何解析它? –
如何解析它 – peace4theapes