这是我的代码:
·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 *)数据。我有基本的XML数据。串行数据来自:<DMX>255,23,1,4,6</DMX>
问题是,它不是一个统一的字符串。它有碎片。比如<DM
,X>255
,,23,1,4,
等。它是随机的,所以我无法跟踪它。有时它发送整个事物,其他人一次发送每个字符。
我在这里添加了一个NSLog(导出字符串):- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
它给了我“255,23,1”或“255,23,1,4”它没有得到整个东西。另外,didEndElement永远不会被调用。我认为这是因为我继续重新启动NSXMLParser,并且当串行数据未正确启动解析后进入。这很难解释。
有什么工作吗?是不是重新启动NSXMLParser,而是向其添加数据的方法?
答案 0 :(得分: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];
}
问题是:你有没有办法检查收到所有数据的时间?