我该怎么做? (的NSXMLParser)

时间:2011-05-29 08:02:34

标签: objective-c cocoa-touch ios nsarray nsxmlparser

我是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之后,对于我得到的每个订单,我该怎么做:

  1. 发送SOAP请求
  2. 收到回复后,创建一个NSXMLParser
  3. 然后解析它。
  4. 我该怎样动态地做到这一点?在解析订单时,一切都很简单,因为我必须这样做:

    - (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的最佳方法是什么?

    感谢。

3 个答案:

答案 0 :(得分:0)

在不同级别的数据层次结构上运行多个nsxmlparser时,我会在内存中保留另一个变量来描述当前正在解析的对象。完成解析初始数据后,设置变量以指示您达到第二级解析。然后,在解析方法中,您可以根据“progress”变量的值使nsxmlparser的行为不同。

答案 1 :(得分:0)

据我了解你的情况,我要做的是让每个NSXMLParser实例拥有它自己的NSXMLParserDelegate,它将对已解析的元素进行正确的处理。举个例子,我会:

  1. XXOrderListParsingDelegate,有自己的委托方法(didStartElement,didEndElement,foundCharacters,你有的那些)

  2. XXOrderParsingDelegate,适用于此案例的委托方法;

  3. 创建NSXMLParser时,为其分配给定案例的正确委托。

  4. 这些代表应该可以访问您的模型(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。简单有趣。有很多很好的教程。