0

GdataxmlNode Objective-C ライブラリを使用して、巨大な xml ドキュメント (3d モデルを記述) を解析しようとしています。

これは、私をブロックする XML のサンプルです。

<library_effects>
    <effect name="Love_Love-fx" id="Love_Love-fx">
        <profile_COMMON>
            <newparam sid="sexy-surface">
                <surface type="2D">
                    <init_from>sexy</init_from>
                    <format>A8R8G8B8</format>
                </surface>
            </newparam>
            ....
        </profile_COMMON>
    </effect>
    ....
</library_effects>

私の目的:

  1. エフェクト名を取得 (*Love_Love-fx*) : 完璧に動作します

  2. init_from の内容を取得する ( sexy ) : まったく機能しません

これが私がそれを解析する方法です:

xmlGetData = [xmlDoc.rootElement elementsForName:@"library_effects"];   

//Effects infos
int eff_c;
NSMutableArray *eff_ids = [[NSMutableArray alloc] init];  //effect names
NSMutableArray *eff_src = [[NSMutableArray alloc] init];  //efects sources

for (GDataXMLElement *e in xmlGetData)
{
    eff_c = [[e elementsForName:@"effect"]count];        
    NSArray *eff_node  = [e elementsForName:@"effect"];
    for (int i = 0; i < eff_c; i++)
    {
        //get the effect name (id & name are the same)
        [eff_ids addObject:[[eff_node objectAtIndex:i]attributeForName:@"id"]];
        //get the content of init_from
        [eff_src addObject:[[eff_node objectAtIndex:i]elementForName:@"init_from"]];
    }
}

私の問題:最後の行([eff_src addObject.........)にSIGABRTがあるため、「init_from」のコンテンツを取得できません

( [[eff_node objectAtIndex:i]elementForName:@"init_from"]]Nil を返すため。?)

誰か助けてくれませんか?(明確で完全なドキュメントはありますか?その一部を説明するブログ投稿しか見ませんでした)

嫌な解決策:使用[[[[[[eff_node objectAtIndex:i]childAtIndex:0]childAtIndex:0]childAtIndex:0]childAtIndex:0]stri‌​ngValue];

4

1 に答える 1

1

eff_nodeは XML ノードeffectです。私の推測では、elementForName:メソッドは再帰的に機能せinit_fromず、 の直接の子ではないため nil を返していeffectます。

それか、 XML内にノードが含まれ effectていない があります。init_from

基本的に、nil を an に追加することはできないため、nil の両方のパラメーターNSMutableArrayをテストする必要があります。addObject:

id idAttr = [[eff_node objectAtIndex:i]attributeForName:@"id"];
if (idAttr != nil)
{
    [eff_ids addObject:idAttr];
}
GDataXMLElement* initFrom = [[eff_node objectAtIndex:i]elementForName:@"init_from"];
if (initFrom != nil)
{
    [eff_src addObject: initFrom];
}

行にも注意してください

NSArray *eff_node  = [[NSArray alloc] init];

空の配列を不必要にインスタンス化しており、手動参照カウントの世界ではメモリリークが発生しています。


私は GDataXML API を見てきましたが、それは a) ドキュメント化されておらず (プライベート API の意味ではなく、ドキュメントを書くことができなかったという意味で)、b) 制限されています。

使用しているメソッドは再帰検索を実行しないため、独自の再帰検索を実装するか、XPath API を使用するかの 2 つのオプションがあります。Fillowing は、必要なノードを取得する必要があります。

 NSError* myError = nil;
 NSArray* initFromNodes = [[eff_node objectAtIndex: i] nodesForXPath: @"//init_from" error: &myError]; 

XPathの//一部は、「ツリーの任意の数のレベル」を意味します

于 2012-10-25T11:21:05.250 に答える