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

Objective c 带有不完整字符串的NSXMLParser输入,objective-c,macos,nsxmlparser,Objective C,Macos,Nsxmlparser,这是我的密码: h m receivedData:NSString*数据通过串行端口接收时调用。我有一些基本的XML数据。串行数据以255,23,1,4,6的形式输入,问题是,它不是以统一字符串的形式输入。它是零碎的。比如,255,23,1,4等等。它是随机的,所以我无法跟踪它。有时它发送整个东西,另一些则一次发送两个字符 我在这里添加了一个NSLog来导出字符串:-voidparser:NSXMLParser*parser foundCharacters:NSString*字符串,它给了我25

这是我的密码:

h

m

receivedData:NSString*数据通过串行端口接收时调用。我有一些基本的XML数据。串行数据以255,23,1,4,6的形式输入,问题是,它不是以统一字符串的形式输入。它是零碎的。比如,255,23,1,4等等。它是随机的,所以我无法跟踪它。有时它发送整个东西,另一些则一次发送两个字符

我在这里添加了一个NSLog来导出字符串:-voidparser:NSXMLParser*parser foundCharacters:NSString*字符串,它给了我255,23,1或255,23,1,4,但它并没有得到全部信息。另外,didEndElement从未被调用过。我认为这是因为我一直在重新初始化NSXMLParser,当串行数据在没有正确启动解析之后进入时。这很难解释

有什么解决办法吗?不重新初始化NSXMLParser,而是向其添加数据的方法?

过程如下:

一,。当调用didStartElement时,分配一个新字符串以包含新标记的值; 2.继续连接在foundCharacters方法中获得的每一段字符串是的,foundCharacters只返回必须连接的部分字符串,而不是整个字符串; 3.调用DiEndElement方法时,将字符串复制到某个位置

编辑

考虑得好,您正在执行该过程,但您并没有使用包含所有数据的唯一数据段初始化解析器。 因此,在您的位置上,我将使用NSMutableData来附加每个数据段,然后仅在拥有完整数据时初始化解析器:

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

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

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

问题是:您是否有办法检查何时收到所有数据?

有办法知道何时收到完整数据?我认为可能不会调用DiEndElement:如果您收到一个半封闭的标记,这是一个问题。您应该使用整个xml数据初始化解析器。不,因为它是常量。我知道你要做什么,但这是一件固定的事情。XML解析器只是读取标记,如果它收到半个标记,这是一个问题。然后我建议将其作为字符串读取,将NSData转换为NSString,以了解最后一个标记何时关闭。当你读取XML文件中的最后一个标记并确定数据已全部关闭时,请启动解析器。
- (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, @"", @"", @"");

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

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

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