Question

Am trying to parse the below xml using TBXML. I want to create an array which contains all the item tag values. How can I traverse through the "item" tags?

<root>
<item>
<northeast_area>
<item>
<new_england_north xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[8]">
    <item xsi:type="xsd:string">boston s, ma</item>
    <item xsi:type="xsd:string">providence, ri</item>
    <item xsi:type="xsd:string">boston, ma </item>
    <item xsi:type="xsd:string">portland, me</item>
    <item xsi:type="xsd:string">boston, ma </item>
    <item xsi:type="xsd:string">boston central</item>
    <item xsi:type="xsd:string">boston north, ma</item>
    <item xsi:type="xsd:string">boston south, ma</item>
</new_england_north>
</item>

<item>
<upstate_new_york xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[6]">
    <item xsi:type="xsd:string">binghampton, ny</item>
    <item xsi:type="xsd:string">rochester, ny</item>
    <item xsi:type="xsd:string">albany s, ny</item>
    <item xsi:type="xsd:string">syracuse, ny</item>
    <item xsi:type="xsd:string">albany, ny</item>
    <item xsi:type="xsd:string">buffalo, ny</item>
</upstate_new_york>
</item>
</northeast_area>
</item>

Was it helpful?

Solution

Here's a piece of sample code that reads the XML from a file. You can tweak it to use an available NSString/NSData object. Note that since we don't know the exact potential formats that your SOAP calls can return, this isn't very robust, it's just a solution that works for the data you've provided.

int main (int argc, const char * argv[])
{

    @autoreleasepool {
        NSString* path = @"/Path/To/Your/File";
        NSData *contents = [[NSFileManager defaultManager] contentsAtPath:path];
        TBXML *xml = [TBXML tbxmlWithXMLData:contents];

        TBXMLElement *rootElement = [xml rootXMLElement];

        TBXMLElement *rootItemElem = [TBXML childElementNamed:@"item" parentElement:rootElement];

        while (rootItemElem != nil) {
            TBXMLElement *areaElement = rootItemElem->firstChild;

            while (areaElement != nil) {
                TBXMLElement *areaItemElement = [TBXML childElementNamed:@"item" parentElement:areaElement];
                while (areaItemElement != nil) {
                    TBXMLElement *localeItem = areaItemElement->firstChild;
                    NSLog(@"Checking locale %s", localeItem->name);
                    TBXMLElement *specificItem = [TBXML childElementNamed:@"item" parentElement:localeItem];
                    while (specificItem != nil) {
                        NSLog(@"Item with value: %@", [TBXML textForElement:specificItem]);
                        specificItem = [TBXML nextSiblingNamed:@"item" searchFromElement:specificItem];
                    }

                    areaItemElement = [TBXML nextSiblingNamed:@"item" searchFromElement:areaItemElement];
                }

                areaElement = areaElement->nextSibling;
            }

            rootItemElem = [TBXML nextSiblingNamed:@"item" searchFromElement:rootItemElem];
        }

    }
    return 0;
}

And the output:

2011-10-19 08:20:40.321 Testing[14768:707] Checking locale new_england_north
2011-10-19 08:20:40.323 Testing[14768:707] Item with value: boston s, ma
2011-10-19 08:20:40.323 Testing[14768:707] Item with value: providence, ri
2011-10-19 08:20:40.324 Testing[14768:707] Item with value: boston, ma
2011-10-19 08:20:40.324 Testing[14768:707] Item with value: portland, me
2011-10-19 08:20:40.325 Testing[14768:707] Item with value: boston, ma
2011-10-19 08:20:40.326 Testing[14768:707] Item with value: boston central
2011-10-19 08:20:40.326 Testing[14768:707] Item with value: boston north, ma
2011-10-19 08:20:40.327 Testing[14768:707] Item with value: boston south, ma
2011-10-19 08:20:40.327 Testing[14768:707] Checking locale upstate_new_york
2011-10-19 08:20:40.328 Testing[14768:707] Item with value: binghampton, ny
2011-10-19 08:20:40.328 Testing[14768:707] Item with value: rochester, ny
2011-10-19 08:20:40.329 Testing[14768:707] Item with value: albany s, ny
2011-10-19 08:20:40.329 Testing[14768:707] Item with value: syracuse, ny
2011-10-19 08:20:40.330 Testing[14768:707] Item with value: albany, ny
2011-10-19 08:20:40.330 Testing[14768:707] Item with value: buffalo, ny

Using this, it should be fairly straightforward to create an NSArray and store the items, or create an NSArray for each locale and separate the items that way. (Storing them in an NSDictionary keyed by the locale.)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top