解析iOS中的Intuit XML响应
问题描述:
我试图解析XML中的REST响应。有关响应的有趣之处在于多个节点具有相同的名称。我正在寻找一种简单的方法来解析iOS中的这些数据。这里有一个例子:解析iOS中的Intuit XML响应
<Report name="BalanceSheet">
<ColDesc><ColTitle>AccountType</ColTitle><ColType>ids_String</ColType></ColDesc>
<ColDesc><ColTitle>Amount</ColTitle><ColType>ids_Amount</ColType></ColDesc>
<Data>
<DataRow>
<ColData>Checking/Savings</ColData>
<ColData>12345345</ColData>
</DataRow>
<DataRow>
<ColData>Accounts Receivable</ColData>
<ColData>674532</ColData>
</DataRow>
<DataRow>
<ColData>Other Current Assets</ColData>
<ColData>423546</ColData>
</DataRow>
<DataRow>
<ColData>Fixed Assets</ColData>
<ColData>63545534</ColData>
</DataRow>
<DataRow>
<ColData>Other Assets</ColData>
<ColData>325465</ColData>
</DataRow>
<DataRow>
<ColData>Accounts Payable</ColData>
<ColData>653653</ColData>
</DataRow>
<DataRow>
<ColData>Other Current Liabilities</ColData>
<ColData>910596.75</ColData>
</DataRow>
<DataRow>
<ColData>Long Term Liabilities</ColData>
<ColData>553797.26</ColData>
</DataRow>
<DataRow>
<ColData>Equity</ColData>
<ColData>45363</ColData>
</DataRow>
</Data>
</Report>
我已经使用SMXMLDocument解析器尝试,以及试图将其转换为一个NSDictionary中使用的XMLReader。 XML的结构方式只是令人困惑。
有什么建议吗?
答
我已经在今天早些时候编写了一个简单的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结构中的列标头信息,但应该是很容易为你添加。
答
它看起来像映射到数据库表(或者甚至可能是Excel电子表格)。看来你得到2列名称。随后是数据,其中<Data>
包含属于相应行的数据。
<Report name="BalanceSheet">
<ColDesc>
<ColTitle>
AccountType
</ColTitle>
<ColType>
ids_String
</ColType>
</ColDesc>
<ColDesc>
<ColTitle>
Amount
</ColTitle>
<ColType>
ids_Amount
</ColType>
</ColDesc>
<Data>
<DataRow>
<ColData>
Checking/Savings
</ColData>
<ColData>
12345345
</ColData>
</DataRow>
<DataRow>
<ColData>
Accounts Receivable
</ColData>
<ColData>
674532
</ColData>
</DataRow>
<DataRow>
<ColData>
Other Current Assets
</ColData>
<ColData>
423546
</ColData>
</DataRow>
<DataRow>
<ColData>
Fixed Assets
</ColData>
<ColData>
63545534
</ColData>
</DataRow>
</Data>
</Report>
AccountType | Amount
--------------------------------
Checking/Savings | 12345345
Accounts Receivable | 674532
决定使用哪种parsser将取决于你的需求,但描述了如何使用每个解析器将这里占用太多空间。 This article描述了不同类型的解析器以及如何使用每种解析器。由于这个结构看起来很简单,我倾向于使用NSXMLParser
(Apple Docs)。
究竟是什么问题?您是要求我们制作XML结构的一部分还是如何解析它? –
如何解析它 – peace4theapes