带有不完整字符串的NSXMLParser输入

时间:2012-12-02 15:42:17

标签: objective-c macos nsxmlparser

这是我的代码:

·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>问题是,它不是一个统一的字符串。它有碎片。比如<DMX>255,23,1,4,等。它是随机的,所以我无法跟踪它。有时它发送整个事物,其他人一次发送每个字符。

我在这里添加了一个NSLog(导出字符串):- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string它给了我“255,23,1”或“255,23,1,4”它没有得到整个东西。另外,didEndElement永远不会被调用。我认为这是因为我继续重新启动NSXMLParser,并且当串行数据未正确启动解析后进入。这很难解释。

有什么工作吗?是不是重新启动NSXMLParser,而是向其添加数据的方法?

1 个答案:

答案 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];
}

问题是:你有没有办法检查收到所有数据的时间?