0

だから私はここでこの奇妙な問題に遭遇しました。NSXMLParser最初にオブジェクトをインスタンス化し、次に終了した XML 要素に応じてその値を設定するパーサーを構築しました。基本的に、XML ファイルを再利用可能な .xml に変換しますNSObject

ここで、パーサーにブレークポイントを設定して、値が正しく設定されているかどうかを判断します。

スクリーンショット デバッガー

うーん、いいですね。正しく解析されました。そのための単体テストを書きましょう。

assertThat([parsedPerson dateOfBirth], is(equalTo(@"22.06.1949")));

今、これが起こります。次のコンソール出力が得られます。

Expected "22.06.1949", but was "22.06.1949        "

何?空白はどこから来るのですか?単体テストでオブジェクトをデバッグさせてください。

スクリーンショット デバッガー 2

同じメモリアドレス?同じオブジェクト?空白はどこから来るのですか?誰かアイデアがありますか?

4

1 に答える 1

2

これはパーサー自体に関連しており、空白は実際には XML ファイル内の実際の空白であることがわかりました。

次のセットアップがあります(持っていました):

- (void)parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {
    [self setCurrentString: [NSMutableString string]];
}

- (void)parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
    string = [string stringByReplacingOccurrencesOfString: @"\n" withString: @""];
    string = [string stringByReplacingOccurrencesOfString: @"\t" withString: @""];
    [currentString appendString: string];
}

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

    if ([elementName isEqualToString: @"dateOfBirth"]) {
        [theObject setDateOfBirth: currentString];
    }

        // ...
}

問題は、要素が終了した後も文字を検索し続けるためNSMutableString currentString、メソッドによって変更されるため、このオブジェクトに を割り当てることはこの場所では危険です。foundCharacters

ここでの誤解は、変更可能な文字列がオブジェクトに割り当てられた後に変更されないということでした。

解決策: 本当に変更したくない場合は、変更しないと思っていても、文字列から変更不可能な文字列を作成します。

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

    NSString *parsedString = [NSString stringWithString:currentString]; // non-mutable copy made here

    if ([elementName isEqualToString: @"dateOfBirth"]) {
        [theObject setDateOfBirth: parsedString];
    }

        // ...
}
于 2013-01-31T22:33:48.657 に答える