2

次のようなxmlファイルがあります。

<result>
<trip duration="03:30">
<takeoff date="2010-06-19" time="18:40" city="Moscow"/>
<landing date="2010-06-19" time="20:10" city="Novgorod"/>
<flight carrier="Rossiya" number="8395" eq="320"/>
<price>13429.00</price>
</trip>
<trip duration="03:40">
<takeoff date="2010-06-19" time="09:20" city="Omsk"/>
<landing date="2010-06-19" time="11:15" city="Paris"/>
<flight carrier="AirFrance" number="1145" eq="320"/>
<price>13229.00</price>
</trip>
<trip duration="03:50">
<takeoff date="2010-06-19" time="07:20" city="Omsk"/>
<landing date="2010-06-19" time="14:15" city="Barcelona"/>
<flight carrier="AirFrance" number="1100" eq="320"/>
<price>13329.00</price>
</trip>
</result>

すべてのパラメータを取得して、3 つの UITableViewCells に配置したいと思います。ご覧のとおり、3 つのフライトとそれらに関するデータがあります。私はTableViewでそれを解析しようとしましたが、うまくいくことしかできませんでした<price>。XML ファイル内の複雑な構造のパラメーターの解析をどのように処理しますか? どうすればtakeoff dateパラメータなどを取得できますか? 私が得ることができる限り、このような私が使用している戦術を適用することはできません:

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
        if ([elementname isEqualToString:@"price"]) 
        {
            currentTweet.dateCreated = currentNodeContent;
        }

どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

1

didStartElement も管理する必要があります。これはサンプルのメタコードです。

-(void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict {
    if([elementName isEqualToString:@"trip"]) {
       currentTweet.tripDuration = [attributeDict objectForKey:@"duration"];
    } else if ([elementName isEqualToString:@"takeoff"]) {
       currentTweet.takeoffDate = [attributeDict objectForKey:@"date"];
       currentTweet.takeoffTime = [attributeDict objectForKey:@"time"];
       currentTweet.takeoffCity = [attributeDict objectForKey:@"city"];
    } else if ([elementName isEqualToString:@"landing"]) {
       ...............
    } else if ...........
}
于 2012-11-24T21:59:14.617 に答える
1

これは、明確に定義された繰り返し要素 (この場合は"trip") の基本モデルと、その中の一連のデータ要素に従う XML ファイルから辞書を作成するためによく使用するコードです。タグの属性 (この場合は"takeoff","landing""flight")、その他 開始タグと終了タグの間のデータ (この場合は のみ) を読み取ります"price"

私は次のivarを持っています:

@interface XmlParserViewController () <NSXMLParserDelegate>
{
    NSMutableArray *trips;
    NSMutableDictionary *currentTrip;
    NSMutableString *currentElement;
}
@end

コードは次のようになります。

- (void)viewDidLoad
{
    [super viewDidLoad];

    trips = [[NSMutableArray alloc] init];

    // I'm getting my xml from my bundle. You get it however you're currently getting it.

    NSString *filename = [[NSBundle mainBundle] pathForResource:@"results" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:filename];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
}

#pragma mark - NSXMLParserDelegate methods

#define kRowElementTag @"trip"

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    NSArray *attributeElementNames = @[@"takeoff", @"landing", @"flight"];
    NSArray *foundCharacterElementNames = @[@"price"];

    if ([elementName isEqualToString:kRowElementTag])
    {
        currentTrip = [[NSMutableDictionary alloc] init];
        [trips addObject:currentTrip];
        if (attributeDict)
            [currentTrip setObject:attributeDict forKey:elementName];
    }
    else if (currentTrip)
    {
        if ([attributeElementNames containsObject:elementName])
        {
            if (attributeDict)
                [currentTrip setObject:attributeDict forKey:elementName];
        }
        else if ([foundCharacterElementNames containsObject:elementName] && currentElement == nil)
        {
            // you can change this to just grab a few fields ... add whatever fields you want to this

            currentElement = [[NSMutableString alloc] init];
            [currentTrip setObject:currentElement forKey:elementName];
        }
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:kRowElementTag])
    {
        currentTrip = nil;
    }
    else if (currentElement)
    {
        currentElement = nil;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (currentElement)
    {
        [currentElement appendString:string];
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"%s error=%@", __FUNCTION__, parseError);

    // we should handle the error here
}

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"%s trips=%@", __FUNCTION__, trips);

    // generally I immediately kick off the reload of the table, but maybe 
    // you want to grok the trips dictionary first.
    //        
    // [self.tableView reloadData];
}

ご想像のとおり、JSON ファイルの解析に慣れてきた、入れ子になった配列/辞書構造のようなものに終わろうとしています。明らかに、XML ファイルの構造の一部をコードで前もって特定しなければならないという事実 (外側の配列には、 、、および"trip"というタグがありますが、"price"` には属性がないという事実) が好きではありません。 t) など。しかし、これは、あちこちにハードコーディングされた値を XML 解析で最初に試みた場合よりも少し優れています。はぁ。"takeoff""landing""flight"

于 2012-11-24T22:01:07.783 に答える