1

XMLリーダーを使用してXML文字列を配列に変換しています。パーサーは子要素をキー「値」に追加していますが、私のobj-cスキルはそれを防ぐ方法を理解するのに十分ではありません-私はPHPの男であり、友人を助けています. また、office と office done が表示されるように、2 つの子要素を下に置く必要があります。

何を入力しているか

        <?xml version="1.0" encoding="utf-8"?>
        <offices>
          <office>
            <phone>02-7532490</phone>
            <address>312 Sen. Gil Puyat Avenue, 18th Flr. Trident Tower</address>
            <suburb>Makati</suburb>
            <postcode>1200</postcode>
            <email>careers@drakepersonnel.com.ph</email>
            <name>Drake Makati</name>
            <latitude>14.56213</latitude>
            <longitude>121.02437</longitude>
          </office>
        </offices>

パーサーから返されるもの

            {
                offices =     {
                    office =         {
                        Address =             {
                            value = "312 Sen. Gil Puyat Avenue, 18th Flr. Trident Tower";
                        };
                        Emails =             {
                            value = "careers@drakepersonnel.com.ph";
                        };
                        Office =             {
                            value = Makati;
                        };
                        Tel =             {
                            value = "02-7532490";
                        };
                        latitude =             {
                            value = "14.56213";
                        };
                        longitude =             {
                            value = "121.02437";
                        };
                        name =             {
                            value = "Drake Makati";
                        };
                        postcode =             {
                            value = 1200;
                        };
                        value = "";
                    };
                    value = "";
                };
            }

パーサーに求めるもの (一部のタグは同じではありません...認識しています)

            (
                    {
                    Address = "1904B 19th Floor West Tower, Philippine Stock Exchange Centre, Exchange Road, Ortigas Center, Pasig City 1600";
                    Emails = "clients@drakepersonnel.com.ph";
                    Fax = "632 753 1524 loc 106";
                    GeoLocation = "14.58273, 121.06154";
                    Office = Philippines;
                    Tel = "632 753 1522-24 / 632 753 2490-93";
                }
            )

これが私が使用しているXMLreader.mファイルです

        //
        //  XMLReader.m
        //
        //  Created by Troy on 9/18/10.
        //  Updated by Antoine Marcadet on 9/23/11.
        //

        #import "XMLReader.h"

        NSString *const kXMLReaderTextNodeKey       = @"value";
        NSString *const kXMLReaderAttributePrefix   = @"@";

        @interface XMLReader ()

        - (id)initWithError:(NSError **)error;
        - (NSDictionary *)objectWithData:(NSData *)data options:(XMLReaderOptions)options;

        @end


        @implementation XMLReader

        #pragma mark -
        #pragma mark Public methods

        + (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error
        {
            XMLReader *reader = [[XMLReader alloc] initWithError:error];
            NSDictionary *rootDictionary = [reader objectWithData:data options:0];
            [reader release];
            return rootDictionary;
        }

        + (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error
        {
            NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
            return [XMLReader dictionaryForXMLData:data error:error];
        }

        + (NSDictionary *)dictionaryForXMLData:(NSData *)data options:(XMLReaderOptions)options error:(NSError **)error
        {
            XMLReader *reader = [[XMLReader alloc] initWithError:error];
            NSDictionary *rootDictionary = [reader objectWithData:data options:options];
            [reader release];
            return rootDictionary;
        }

        + (NSDictionary *)dictionaryForXMLString:(NSString *)string options:(XMLReaderOptions)options error:(NSError **)error
        {
            NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
            return [XMLReader dictionaryForXMLData:data options:options error:error];
        }

        #pragma mark -
        #pragma mark Parsing

        - (id)initWithError:(NSError **)error
        {
            if (self = [super init])
            {
                errorPointer = error;
            }
            return self;
        }

        - (void)dealloc
        {
            [dictionaryStack release];
            [textInProgress release];
            [super dealloc];
        }

        - (NSDictionary *)objectWithData:(NSData *)data options:(XMLReaderOptions)options
        {
            // Clear out any old data
            [dictionaryStack release];
            [textInProgress release];

            dictionaryStack = [[NSMutableArray alloc] init];
            textInProgress = [[NSMutableString alloc] init];

            // Initialize the stack with a fresh dictionary
            [dictionaryStack addObject:[NSMutableDictionary dictionary]];

            // Parse the XML
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

            [parser setShouldProcessNamespaces:(options & XMLReaderOptionsProcessNamespaces)];
            [parser setShouldReportNamespacePrefixes:(options & XMLReaderOptionsReportNamespacePrefixes)];
            [parser setShouldResolveExternalEntities:(options & XMLReaderOptionsResolveExternalEntities)];

            parser.delegate = self;
            BOOL success = [parser parse];

            [parser release];

            // Return the stack's root dictionary on success
            if (success)
            {
                NSDictionary *resultDict = [dictionaryStack objectAtIndex:0];
                return resultDict;
            }

            return nil;
        }


        #pragma mark -
        #pragma mark NSXMLParserDelegate methods

        - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
        {
            // Get the dictionary for the current level in the stack
            NSMutableDictionary *parentDict = [dictionaryStack lastObject];

            // Create the child dictionary for the new element, and initilaize it with the attributes
            NSMutableDictionary *childDict = [NSMutableDictionary dictionary];
            [childDict addEntriesFromDictionary:attributeDict];

            // If there's already an item for this key, it means we need to create an array
            id existingValue = [parentDict objectForKey:elementName];
            if (existingValue)
            {
                NSMutableArray *array = nil;
                if ([existingValue isKindOfClass:[NSMutableArray class]])
                {
                    // The array exists, so use it
                    array = (NSMutableArray *) existingValue;
                }
                else
                {
                    // Create an array if it doesn't exist
                    array = [NSMutableArray array];
                    [array addObject:existingValue];

                    // Replace the child dictionary with an array of children dictionaries
                    [parentDict setObject:array forKey:elementName];
                }

                // Add the new child dictionary to the array
                [array addObject:childDict];
            }
            else
            {
                // No existing value, so update the dictionary
                [parentDict setObject:childDict forKey:elementName];
            }

            // Update the stack
            [dictionaryStack addObject:childDict];
        }

        - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
        {
            // Update the parent dict with text info
            NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];

            // Set the text property
            if ([textInProgress length] > 0)
            {
                // trim after concatenating
                NSString *trimmedString = [textInProgress stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

                [dictInProgress setObject:[[trimmedString mutableCopy] autorelease] forKey:kXMLReaderTextNodeKey];


                // Reset the text
                [textInProgress release];
                textInProgress = [[NSMutableString alloc] init];
            }

            // Pop the current dict
            [dictionaryStack removeLastObject];
        }

        - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
        {
            // Build the text value
            [textInProgress appendString:string];
        }

        - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
        {
            // Set the error pointer to the parser's error object
            *errorPointer = parseError;
        }

        @end

任意のヘルプをいただければ幸いです。

4

1 に答える 1

1

XMLパーサーの結果の辞書から必要な値を選択するだけの問題はどこにありますか? XML 要素名がわかっている場合は、次のように簡単に実行できます。

NSDictionary *xmlParsedDict = ....
NSDictionary *offices = [xmlParsedDict objectForKey:@"offices"];
NSDictionary *office = [offices objectForKey:@"office"];

また、XML 要素officesには複数のオフィスが含まれている可能性があるため、配列からすべてのoffice辞書を単純に収集します。offices

乾杯、アンカ

于 2012-07-31T00:19:24.630 に答える