これが私のコードです:
.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 つの統一された文字列として入ってこないことです。それはバラバラになります。、<DM
、X>255
、,23,1,4,
など。 ランダムなので追跡できません。全体を送信することもあれば、一度に数文字ごとに送信することもあります。
ここに (文字列をエクスポートするための) NSLog を追加しました- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
。さらに、didEndElement が呼び出されることはありません。NSXMLParser を再起動し続けており、解析が適切に開始されていない後にシリアル データが入ってくるためだと思います。説明するのは難しいです。
回避策はありますか?NSXMLParser を再開するのではなく、データを追加する方法はありますか?