Как мне это сделать? (NSXMLParser) - PullRequest
0 голосов
/ 29 мая 2011

Я довольно новичок в 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;
    }
)

Теперь для каждого из этих ордеров (на основе идентификатора ордера) мне нужно отправить еще один запрос, который вернет список единиц. Объекты имеют свойство «Номер и имя объекта». Теперь это где я запутался. После разбора ордера, как мне, для каждого из полученных ордеров:

  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 одновременно, поэтому я немного смущен тем, как мне это сделать.

Кроме того, быстрый вопрос. У меня также есть запрос, который возвращает около 2000 элементов с большим количеством подэлементов. Каков наилучший способ сохранить это в памяти, выполнить поиск по нему, а затем заполнить nstableview?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 мая 2011

Насколько я понимаю, ваш случай заключается в том, чтобы каждый экземпляр NSXMLParser имел свой собственный тип NSXMLParserDelegate, который выполнял бы надлежащую обработку проанализированных элементов. просто в качестве примера я бы имел:

  1. XXOrderListParsingDelegate, со своим собственным методом делегатов (didStartElement, didEndElement, foundCharacters, те, которые у вас есть)

  2. XXOrderParsingDelegate, с подходящими для этого случая методами делегатов;

  3. Когда вы создаете NSXMLParser, присвойте ему соответствующий делегат для данного случая.

эти делегаты должны иметь полный доступ к вашей модели (dict, section, что угодно), это может потребовать некоторых изменений в вашем дизайне.

Это должно быть правильно.

Что касается вашего второго вопроса, одна из возможностей - использование sqlite. здесь у вас есть учебник.

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

0 голосов
/ 30 мая 2011

Попробуйте это

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. Легко и интересно. Есть много хороших учебных пособий.

0 голосов
/ 29 мая 2011

При запуске нескольких nsxmlparser s на разных уровнях иерархии данных я бы оставил в памяти другую переменную, которая описывает текущий анализируемый объект.Когда вы закончите анализ исходных данных, установите переменную, чтобы указать, что вы находитесь на втором уровне анализа.Затем в ваших методах синтаксического анализа вы можете заставить свой nsxmlparser вести себя по-разному, в зависимости от значения переменной «progress».

...