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>问题是,它不是作为一个统一的字符串进来的。它是碎片化的。比如, <DM, X>255, ,23,1,4,, 等等。它是随机的,所以我无法追踪它。有时它会发送整个内容,有时它会一次发送几个字符。

我在这里添加了一个 NSLog(导出字符串):- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string它给了我 "255,23,1" 或 "255,23,1,4" 它没有得到全部。另外, 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 回答