1

これが私のコードです:

.h

NSMutableString *dmxCharacters;
NSXMLParser *parser;

.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    parser = [[NSXMLParser alloc] init];
}

- (void) receivedData:(NSString *)data {

NSData *data2 = [data dataUsingEncoding:NSUTF8StringEncoding];
parser = [[NSXMLParser alloc] initWithData:data2];
[parser setDelegate:(id)self];
[parser parse];

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

    dmxCharacters = [[NSMutableString alloc] initWithCapacity:500];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    [dmxCharacters appendString:string];
}

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

    NSRunAlertPanel(@"", dmxCharacters, @"", @"", @"");

}

receivedData:(NSString*)data は、シリアル ポート経由でデータを受信したときに呼び出されます。基本的な XML データが入ってきます。シリアル データが次のように入ってきます。<DMX>255,23,1,4,6</DMX>問題は、1 つの統一された文字列として入ってこないことです。それはバラバラになります。、<DMX>255,23,1,4,など。 ランダムなので追跡できません。全体を送信することもあれば、一度に数文字ごとに送信することもあります。

ここに (文字列をエクスポートするための) NSLog を追加しました- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string。さらに、didEndElement が呼び出されることはありません。NSXMLParser を再起動し続けており、解析が適切に開始されていない後にシリアル データが入ってくるためだと思います。説明するのは難しいです。

回避策はありますか?NSXMLParser を再開するのではなく、データを追加する方法はありますか?

4

1 に答える 1

0

手順は次のとおりです。

1. didStartElement が呼び出されたときに、新しいタグの値を含む新しい文字列を割り当てます。
2. foundCharacters メソッドで取得した文字列の各部分を連結し続けます (そうです、foundCharacters は、文字列全体ではなく、連結する必要がある部分的な文字列を返すだけです)。
3. didEndElement メソッドが呼び出されたときに文字列をどこかにコピーします。

編集

よく考えてその手順を実行していますが、すべてのデータを含む一意のデータでパーサーを初期化していません。
したがって、あなたの場所では、 NSMutableData を使用して各データを追加し、完全なデータがある場合にのみパーサーを初期化します。

@property (nonatomic, strong) NSMutableData* data; // not synthesizing it

- (void) receivedData:(NSString *)data 
{

    NSData *data2 = [data dataUsingEncoding:NSUTF8StringEncoding];
    [self.data appendData: data2];
}

問題は、すべてのデータがいつ受信されたかを確認する方法がありますか?

于 2012-12-02T16:36:00.870 に答える