1

私はしばらくこれを理解しようとしてきましたが、うまくいきません。うまくいけば、ここにいる誰かがアイデアを持っているでしょう。

解析している XML データがいくつかあります。次のようになります。

    <Name>MAC 101</Name>
    <Modes>
        <Mode>
            <Name>Basic RGB</Name>
            <ChannelCount>8</ChannelCount>
        </Mode>
        <Mode>
            <Name>Raw RGB</Name>
            <ChannelCount>12</ChannelCount>
        </Mode>
    </Modes>

私がやっていることは、情報を SQLite データベースに保存することですが、最初にいくつかの情報を 1 つの文字列に結合する必要があります。次のような文字列が必要です: (改行あり)

8 ベーシック RGB
12 RAW RGB

ただし、複数の「モード」が存在する場合もあります。この例では 2 つしかありません。場合によっては、12 以上になることもあります。

私が使用している現在のコードは NSXMLParser です。

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if (isStatus) {
    if ([elementName isEqualToString:@"Name"]) {
        CurrentFixture.Title = currentNodeContent;
        NSLog(@"Name: %@",currentNodeContent);
    }
    if ([elementName isEqualToString:@"Name"]) {
        CurrentFixture.ModeName = currentNodeContent;
        NSLog(@"Mode Name: %@",currentNodeContent);
    }
    if ([elementName isEqualToString:@"ChannelCount"]) {
        CurrentFixture.ChannelCount = currentNodeContent;
        NSLog(@"Channel Count: %@",currentNodeContent);
    }
}
 if ([elementName isEqualToString:@"Fixture"]) {
    NSLog(@"Do something with data.");
    [self.data addObject:CurrentFixture];
    NSLog(@"Data: %@",);
    CurrentFixture = nil;
    currentNodeContent = nil;
    }
}

モード名は、実際の名前と混同しないようにタグを変更しますが、現時点では、何かを機能させる必要があります。アドバイスやガイダンスをいただければ幸いです。ありがとうアンドリュー

4

2 に答える 2

0

あなたが必要

  • すべてのモードを追跡するための配列modesArray

  • ChannelCountあなたのモードを追跡するためのオブジェクトのNameディクショナリmodeDictionary。と

  • およびいくつかのBOOL変数により、モードの配列を解析しているかどうかがわかります (最も重要なのはName、 aModeと上位レベルNameを区別できるようにするためですparsingModes

次に、

  • モードを開始するときは、アレイを初期化します。

  • を起動するModeと、ディクショナリが初期化されます。

  • Nameまたはを完了したらChannelCount、モード ディクショナリを更新します。

  • を完了するModeと、これら 2 つの値を 1 つの文字列に連結し、その文字列を配列に追加できます。

  • を完了すると、配列Modes内のすべての文字列をMode改行で結合できます。

したがって、次のような結果が得られます。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"Fixture"])
    {
        currentFixture = [[Fixture alloc] init];
    }
    else if ([elementName isEqualToString:@"Modes"])
    {
        modesArray = [NSMutableArray array];
        parsingModes = YES;
    }
    else if ([elementName isEqualToString:@"Mode"])
    {
        modeDictionary = [NSMutableDictionary dictionary];
    }
    else
    {
        currentNodeContent = [NSMutableString string];
    }
}

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

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (parsingModes)
    {
        if ([elementName isEqualToString:@"Name"]) {
            modeDictionary[@"Name"] = currentNodeContent;
        }
        else if ([elementName isEqualToString:@"ChannelCount"]) {
            modeDictionary[@"ChannelCount"] = currentNodeContent;
        }
        else if ([elementName isEqualToString:@"Mode"]) {
            [modesArray addObject:[NSString stringWithFormat:@"%@ %@", modeDictionary[@"ChannelCount"], modeDictionary[@"Name"]]];
            modeDictionary = nil;
        }
        else if ([elementName isEqualToString:@"Modes"]) {
            currentFixture.longStringWithModes = [modesArray componentsJoinedByString:@"\n"];
            modesArray = nil;
            parsingModes = NO;
        }
    }
    else
    {
        if ([elementName isEqualToString:@"Name"]) {
            currentFixture.title = currentNodeContent;
        }
    }

    // carry on with your other elements

    currentNodeContent = nil;
}

(キャメルケースに移行したことに注意してください。)

これを行う方法を示したので、私はそれをしないことをお勧めします。データベースがデータを別々のフィールドに保持することをお勧めします。このようにすべてを 1 つの文字列に連結することは、UI で行うことかもしれませんが、データベースはおそらく基になるデータ構造を反映している必要があります。そうは言っても、Modeフィクスチャごとに複数のエントリがあるため、おそらくそれらに対して個別のテーブルが必要になるでしょう。

于 2013-09-07T13:56:31.690 に答える
0

すべての解析が完了したら、関数が必要になります。XML ファイル全体が提供されたようには見えませんが、外側のタグは<Fixtures>で、内側のタグは<Fixture>. その仮定を外して、チェックインを追加できますparser:didEndElement:

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    //...

    if ([elementName isEqualToString:@"Fixtures"]) {
        [self saveModesToDatabase];
    }
}

-(void) saveModesToDatabase {
    NSString* allModes = @"";
    for (Fixture* aFixture in self.data) {
        NSString* modeString = [aFixture.ChannelCount stringByAppendingFormat:@" %@", aFixture.Title];

        // Don't add a line break if it's the last object
        if (aFixture == [self.data lastObject])
            allModes = [allModes stringByAppendingFormat:@"%@", modeString];
        else
            allModes = [allModes stringByAppendingFormat:@"%@\n", modeString];
    }

    // Save allModes to database
}
于 2013-09-07T13:26:51.623 に答える