Search code examples
iphoneiosxmlxml-parsinggdataxml

How can I parse this xml using GDataXML parser?


<list>
    <OrderData HASH="1408108039"></OrderData>
    <OrderData HASH="208524692">
        <id>97</id>
        <customer>
            <CustomerData HASH="2128670187"></CustomerData></customer>
        <billingAddress></billingAddress><deliveryAddress></deliveryAddress>
        <orderDetail>
            <list>
                <OrderDetailData HASH="516790072"></OrderDetailData>
                <OrderDetailData HASH="11226247"></OrderDetailData>
                <OrderDetailData HASH="11226247"></OrderDetailData>
            </list>
        </orderDetail>
        <log/>
    </OrderData>
    <OrderData HASH="1502226778"></OrderData>
</list>

I cannot find a solution to find the number of OrderDetailData elements? I also read http://iphonebyradix.blogspot.com/2011/03/using-gdata-to-parse-xml-file.html this url.

Thanks in advance.

Edit:

I am explaining my requirement again. In this xml there will be multiple OrderData element. Now I have to count the number of OrderDetailData elemnts from a particular OrderData element. Suppose that, according to my xml, the current parsed xml has one OrderData element, named id and its value is 97. Now, I have to count how many OrderDetailData elements are contained in the OrderData(whichid` is 97).


Solution

  • This is a simple example how to retrieve some data. This example is very simple and not use XPath expression. I suggest you first understand how it works and then use XPath expression. In my opinion it is not useful to use XPath expression if you cannot understand how the parser works.

    NSString* path = [[NSBundle mainBundle] pathForResource:@"test2" ofType:@"xml"];
    
    NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:path];
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData 
                                                           options:0 error:&error];
    //NSLog(@"%@", doc.rootElement); // print the whole xml
    
    NSArray *orderDataArray = [doc.rootElement elementsForName:@"OrderData"];
    
    for (GDataXMLElement *orderDataElement in orderDataArray) {
    
        if([orderDataElement childCount] > 0)
        {            
            NSString *attributeForOrderDataElement = [(GDataXMLElement *) [orderDataElement attributeForName:@"HASH"] stringValue];   
    
            NSLog(@"attributeForOrderDataElement has value %@", attributeForOrderDataElement);
    
            GDataXMLElement* idElement = (GDataXMLElement*)[[orderDataElement elementsForName:@"id"] objectAtIndex:0];
    
            NSLog(@"id has value %@", idElement.stringValue);
    
            GDataXMLElement* orderDetailElement = (GDataXMLElement*)[[orderDataElement elementsForName:@"orderDetail"] objectAtIndex:0];
    
            GDataXMLElement* listElement = (GDataXMLElement*)[[orderDetailElement elementsForName:@"list"] objectAtIndex:0];            
    
            NSArray* orderDetailDataArray = [listElement elementsForName:@"OrderDetailData"];
    
            int count = 0;
            for (GDataXMLElement *orderDetailDataElement in orderDetailDataArray) {
    
                NSString *attributeForOrderDetailDataElement = [(GDataXMLElement *) [orderDetailDataElement attributeForName:@"HASH"] stringValue];
    
                NSLog(@"attributeForOrderDetailDataElement has value %@", attributeForOrderDetailDataElement);
    
                count++;
            }
    
            NSLog(@"%d", count);
        }
    }
    
    [doc release];
    [xmlData release]; 
    

    This is the output console:

    attributeForOrderDataElement has value 208524692 <-- HASH value
    id has value 97 <-- id value
    attributeForOrderDetailDataElement has value 516790072 <-- HASH value
    attributeForOrderDetailDataElement has value 11226247
    attributeForOrderDetailDataElement has value 11226247
    3 <-- the count
    

    Hope it helps.

    Edit

    test2.xml contains your file but you could pass it as a string. You can also pass as parameters as string like the following:

    NSString* xmlString = @"<list>"
        "<OrderData HASH=\"1408108039\"></OrderData>"
        "<OrderData HASH=\"208524692\">"
        "<id>97</id>"
        "<customer>"
        "<CustomerData HASH=\"2128670187\"></CustomerData>"
        "</customer>"
        "<billingAddress></billingAddress>"
        "<deliveryAddress></deliveryAddress>"
        "<orderDetail>"
        "<list>"
        "<OrderDetailData HASH=\"516790072\"></OrderDetailData>"
        "<OrderDetailData HASH=\"11226247\"></OrderDetailData>"
        "<OrderDetailData HASH=\"11226247\"></OrderDetailData>"
        "</list>"
        "</orderDetail>"
        "<log/>"
        "</OrderData>"
        "<OrderData HASH=\"1502226778\"></OrderData>"
        "</list>";    
    
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlString options:0 error:&error];