我是NSXMLParser的新手,我需要一些建议。这是我的情况:
我正在向服务器发送SOAP请求以获取“订单”列表,该列表以此格式返回订单列表:
<Order>
<OrderID> string </OrderID>
<OrderName> string </OrderName>
</Order>
所以,我用一堆这些Orders解析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),我需要发送另一个请求,它将返回一个单位列表。单位具有“单位编号和名称”属性。现在这是我困惑的地方。解析Order之后,对于我得到的每个订单,我该怎么做:
我该怎样动态地做到这一点?在解析订单时,一切都很简单,因为我必须这样做:
- (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的最佳方法是什么?
感谢。
答案 0 :(得分:0)
在不同级别的数据层次结构上运行多个nsxmlparser
时,我会在内存中保留另一个变量来描述当前正在解析的对象。完成解析初始数据后,设置变量以指示您达到第二级解析。然后,在解析方法中,您可以根据“progress”变量的值使nsxmlparser的行为不同。
答案 1 :(得分:0)
据我了解你的情况,我要做的是让每个NSXMLParser实例拥有它自己的NSXMLParserDelegate,它将对已解析的元素进行正确的处理。举个例子,我会:
XXOrderListParsingDelegate,有自己的委托方法(didStartElement,didEndElement,foundCharacters,你有的那些)
XXOrderParsingDelegate,适用于此案例的委托方法;
创建NSXMLParser时,为其分配给定案例的正确委托。
这些代表应该可以访问您的模型(dict,sections,等等),这可能需要对您的设计进行一些更改。
这应该是正确的。
关于你的第二个问题,一种可能性是使用sqlite。 here你有一个教程。
1 http://blog.objectgraph.com/index.php/2010/04/08/how-to-use-sqlite-with-uitableview-in-iphone-sdk/
答案 2 :(得分:0)
试试这个
for (NSManagedObject* managedObject in "YourArray") {
//You can get the OrderID's individually like this
[managedObject valueForKey:@"OrderID"];
//With the orderID you can send requests for each
}
为您快速提问...您可以选择Coredata Concepts。简单有趣。有很多很好的教程。