【发布时间】:2011-09-04 05:28:54
【问题描述】:
我对 NSXMLParser 很陌生,我需要一些建议。这是我的情况:
我正在向服务器发送 SOAP 请求以获取“订单”列表,该列表以这种格式返回订单列表:
<Order>
<OrderID> string </OrderID>
<OrderName> string </OrderName>
</Order>
所以,我用一堆这些订单解析 xml,并用可变字典填充我的可变 nsarray,所以最后它看起来像这样:
(
{
OrderID = 2011417335319;
OrderNumber = 100;
},
{
OrderID = 2011340029503;
OrderNumber = TestOrder3;
},
{
OrderID = 20113223404613;
OrderNumber = 1234;
},
{
OrderID = 20113692554635;
OrderNumber = EricOrder;
},
{
OrderID = 2;
OrderNumber = TestOrder2;
},
{
OrderID = 201144231410461;
OrderNumber = TestOrder4;
}
)
现在,对于每个订单(基于 OrderID),我需要发送另一个请求,该请求将返回一个单位列表。单位具有“单位编号和名称”属性。现在这就是我感到困惑的地方。解析完订单后,我如何,对于我得到的每一个订单:
- 发送 SOAP 请求
- 收到响应后,创建一个 NSXMLParser
- 然后解析它。
我怎样才能动态地做到这一点?解析订单时,一切都很简单,我只需要这样做:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"GetOrdersResult"]) {
if (array) {
[array release];
}
array = [[NSMutableArray alloc] init];
} else if ([elementName isEqualToString:@"Order"]) {
if (dict) {
[dict release];
}
dict = [[NSMutableDictionary alloc] initWithCapacity:2];
} else if ([elementName isEqualToString:@"OrderID"]) {
sections = E_OrderID;
} else if ([elementName isEqualToString:@"OrderNumber"]) {
sections = E_OrderNumber;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (sections == E_OrderID) {
[dict setObject:string forKey:@"OrderID"];
} else {
[dict setObject:string forKey:@"OrderNumber"];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"Order"]) {
[array addObject:dict];
}
}
但是现在,将有多个 NSXMLParsers 同时运行,所以我有点困惑我应该如何做到这一点。
另外,快速提问。我还有一个请求,它返回大约 2,000 个带有很多子元素的元素。将它存储在内存中,搜索它,然后填充 nstableview 的最佳方法是什么?
谢谢。
【问题讨论】:
标签: objective-c cocoa-touch ios nsarray nsxmlparser