0

次の構造で構成されるいくつかのxmlがあります

<Succession SuccessionID= ....>
    <LinkedSuccession>
        <Succession SuccessionID= ..../> // multiple possible
    </LinkedSuccession>
    <SUF>
        <SeeAlsoSuccession>
            <Succession SuccessionID= ..../> // multiple possible
        </SeeAlsoSuccession>
    </SUF>
    <Plugins>
        <Plugin PluginIdent= ..../> // multiple possible
    </Plugins>
    <Card>
        <Actives>  // multiple possible
            <Active activeNo= ....>  // multiple possible
                <Machs>
                    <Mach Mach= ...../>  // multiple possible
                </Machs>
            </Active>
        </Actives>
    </Card>
</Succession>

NSXMLParser を使用してこれを解析する方法を知りたいのですが、2つの方法を知っています

- (void)startTheParsingProcess:(NSData *)parserData
{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process
    [parser setDelegate:self];
    [parser parse]; // starts the event-driven parsing operation.
}


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    //..??
}

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

    //..??


}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"Paser Error = %@", parseError);
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A parsing failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [errorAlert show];
}


- (void)parserDidEndDocument:(NSXMLParser *)parser
{
 //..
}

通常、私はこのようなものを使用して各要素にアクセスしますが、この xml ファイルの構造のため、Succession を読み取るときのように、最後に読み取った値で値を上書きする場合と同様に、これは適切に機能しません。

if ([elementName isEqualToString:@"Succession"]) {

など、しかし、この XML ファイルの構造は私が処理するには多すぎます.. NSXMLParser を使用してこの xml ファイルを読み取る方法について、助けを得たいと思っています。

どんな助けでも大歓迎です。

4

4 に答える 4

0

役立つ可能性のある疑似コードを次に示します。

NSMutableArray *linkedSuccessionIDs = [NSMutableArray array];
NSMutableArray *seeAlsoSuccessionIDs = [NSMutableArray array];
BOOL isInLinkedSuccession = NO;
BOOL isInSeeAlsoSuccession = NO;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"LinkedSuccession"])
    {
        isInLinkedSuccession = YES;
    }
    else if ([elementName isEqualToString:@"SeeAlsoSuccession"])
    {
        isInSeeAlsoSuccession = YES;
    }
    else if ([elementName isEqualToString:@"Succession"])
    {
        if (isInLinkedSuccession)
        {
            [linkedSuccessionIDs addObject:[attributeDict[@"SuccessionID"]]];
        }
        else if (isInSeeAlsoSuccession)
        {
            [seeAlsoSuccessionIDs addObject:[attributeDict[@"SuccessionID"]]];
        }
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"LinkedSuccession"])
    {
        isInLinkedSuccession = NO;
    }
    else if ([elementName isEqualToString:@"SeeAlsoSuccession"])
    {
        isInSeeAlsoSuccession = NO;
    }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    [self processLinkedSuccessionIDs:linkedSuccessionIDs];
    [self processSeeAlsoSuccessionIDs:seeAlsoSuccessionIDs];
}
于 2013-06-14T15:16:50.133 に答える
0

LinkedSuccession簡単な解決策は、あなたが a の中にいるのか、 a の中にいるのか、どちらの中にいないのかを追跡するためのクラス プロパティを単純に持つことです。そうすればSeeAlsoSuccession、要素に遭遇したときにSuccession、それらの 2 つのサブ要素配列のいずれかにいるかどうかを知ることができます。またはトップレベルのエントリを扱っているかどうかSuccessionに応じて行動してください。


上記で提案したように、問題には簡単なアプローチがありますが、NSXMLParser課題に取り組むのに役立つ可能性のある 2 つの追加の実装を提案する場合があります。NSXMLParser 1 つ目は、 GitHub で利用可能なのブロックベースの実装です。XML サンプル (すべてのデータが XML タグの属性にあるように見える) でこれを使用するには、 を指定するだけですbeginElementBlockが、私が提供したサンプル コードでは、endElementBlock,それも)。とにかく、サンプル XML では、次のようにします。

XMLBlockParser *parser = [[XMLBlockParser alloc] initWithData:data];

// handler for the parsing of the start of an element, often useful for parsing the attributes included within
// that opening element tag

parser.beginElementBlock = ^(NSArray *elementNames, NSDictionary *attributeDict) {
    NSString *elementName = [elementNames lastObject];

    if ([elementName isEqualToString:@"Succession"])
    {
        if ([elementNames count] == 1)
        {
            // top level "Succession": create an object

            self.currentObject = [NSMutableDictionary dictionary];
            [self.currentObject setObject:attributeDict[@"SuccessionID"] forKey:@"SuccessionID"];
            [self.objects addObject:self.currentObject];
        }
        else
        {
            // "Succession" in either "LinkedSuccession" or "SeeAlsoSuccession"

            // let's find the array "LinkedSuccession" or "SeeAlsoSuccession" objects

            NSString *container = elementNames[[elementNames count] - 2];
            NSMutableArray *array = self.currentObject[container];
            if (!array)
            {
                // if not found, then let's create it and add it to our currentObject

                array = [NSMutableArray array];
                self.currentObject[container] = array;
            }

            // how add the attributeDict value

            [array addObject:attributeDict[@"SuccessionID"]];
        }
    }
};

[parser parse];

もう 1 つのアプローチはNSXMLParser、XML 全体をネストされたツリー構造に単純に解析する を使用することです(GitHub のこの例など) 。このため、XML を解析するためのアプリケーション固有のコードを記述する必要はありませんが、標準のNSArray/よりも少し複雑なものになりNSDictionaryます。

いくつかの可能なアプローチがあります。これが役立つことを願っています。

于 2013-06-14T04:37:25.903 に答える
0

NSXMLParser を使用するには、実際には 2 つの方法があることを覚えておく必要があります。 検索 データ構造の構築

処理しようとしている構造またはスキーマを事前に知っていれば、これらはそれほど悪くはありません。わからない場合は、もっと手間がかかりますが、パーサーは途中で lineNumber と columnNumber の 2 つの重要なメソッドを提供します。

これらを有利に利用できます。基本的に、不明な XML 構造を処理するときに採用できる戦略は、予行演習または事前解析を行うことです。その中で、列ごとの合計列と行、または要素またはコメントなどを追跡します。慣れるまでには試行錯誤が必要になる場合があります。しかし、基本的には、XML の構造を調べてから、その後のラウンドで何を使用できるかについてある程度のアイデアを得ることができます。

事前解析の利点は、非常に高速になることです。また、後続の解析操作がより簡単かつ高速になります。

トラップは、受信内容が正確にわからず、それが小さくない場合に、すべてを 1 つの解析操作で実行しようとします。

于 2013-06-14T09:25:33.107 に答える