【问题标题】:How should I do this? (NSXMLParser)我该怎么做? (NSXML 解析器)
【发布时间】: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),我需要发送另一个请求,该请求将返回一个单位列表。单位具有“单位编号和名称”属性。现在这就是我感到困惑的地方。解析完订单后,我如何,对于我得到的每一个订单:

  1. 发送 SOAP 请求
  2. 收到响应后,创建一个 NSXMLParser
  3. 然后解析它。

我怎样才能动态地做到这一点?解析订单时,一切都很简单,我只需要这样做:

- (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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      据我了解您的情况,我要做的是让每个 NSXMLParser 实例都有自己的 NSXMLParserDelegate 类型,可以正确处理已解析的元素。举个例子,我会:

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

      2. XXOrderParsingDelegate,使用适合这种情况的委托方法;

      3. 当您创建 NSXMLParser 时,为给定案例分配适当的委托。

      这些代表应该可以访问您的模型(字典、部分等),这可能需要对您的设计进行一些更改。

      这应该是正确的。

      关于你的第二个问题,一种可能性是使用 sqlite。 here你有教程。

      1http://blog.objectgraph.com/index.php/2010/04/08/how-to-use-sqlite-with-uitableview-in-iphone-sdk/

      【讨论】:

        【解决方案3】:

        试试这个

        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。轻松有趣。有很多不错的教程可供使用。

        【讨论】:

          猜你喜欢
          • 2015-10-10
          • 2018-01-16
          • 2012-02-29
          • 2012-05-26
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 2014-01-23
          • 2011-05-17
          相关资源
          最近更新 更多