2012-11-06 62 views
0

我试图解析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的结构方式只是令人困惑。

有什么建议吗?

+0

究竟是什么问题?您是要求我们制作XML结构的一部分还是如何解析它? –

+0

如何解析它 – peace4theapes

回答

0

我已经在今天早些时候编写了一个简单的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结构中的列标头信息,但应该是很容易为你添加。

1

它看起来像映射到数据库表(或者甚至可能是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描述了不同类型的解析器以及如何使用每种解析器。由于这个结构看起来很简单,我倾向于使用NSXMLParserApple Docs)。