NSXML分析和符号导致关机

NSXML分析和符号导致关机

问题描述:

我正在解析一个简单的XML文件,但是有时在节点中存在包含与符号(&)的标签。我已经做了一些研究herehere,但问题仍然存在。问题在于解析器在遇到有问题的XML元素时会停下来。该XML看起来是这样的:NSXML分析和符号导致关机

<video> 
    <video_id>42</video_id> 
    <video_header>Six & Eight</video_header> 
    <video_subheader>So Long</video_subheader> 
</video> 

解析器正在更新一个对象,叫DisStep,具有parsedVideoArray属性。该属性只是一个Parsed_Video对象的数组。所以问题是,当解析器得到foundCharacters的元素video_header它不会继续didEndElement。实际上,currentNodeContent的foundCharacters方法中的NSLog只是"Six "

这里是解析器的代码。它所做的只是查看视频并收集有关它们的信息。

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementName isEqualToString:@"video"]) 
    { 
     videoBeingParsed = [[Parsed_Video alloc] init]; 
    } 
} 

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    string = [string stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"]; 
    currentNodeContent = (NSMutableString *) string; 
} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"video_id"]) 
    { 
     videoBeingParsed.Video_ID = currentNodeContent; 
     currentNodeContent = nil; 
    } 
    else if ([elementName isEqualToString:@"video_header"]) 
    { 
     videoBeingParsed.Video_Header = currentNodeContent; 
     currentNodeContent = nil; 
    } 

    else if ([elementName isEqualToString:@"video_subheader"]) 
    { 
     videoBeingParsed.Video_SubHeader = currentNodeContent; 
     currentNodeContent = nil; 
    } 
    else if ([elementName isEqualToString:@"video"]) 
    { 
     [DisStep.parsedVideoArray addObject:videoBeingParsed]; 
     currentNodeContent = nil; 
     videoBeingParsed = nil; 
    } 
} 
@end 

我试过了stringByReplacingOccurrencesOfString: withString:,但解析器仍然停止工作。除了改变XML之外,有没有办法解决这个问题?

+0

在将数据提供给解析器之前,请对符号进行编码。 – Jeremy

+0

你如何从数据中对&符号进行编码?这是否意味着改变XML或者是否有可能在解析器中以编程方式执行它? –

+0

@Jeremy对不起忘了标签... –

的问题是,你还没有被赋予XML和解析器乱七八糟合法获得,因为它看到的数据是不合法的。该XML specification

与符号字符(&)和左尖括号(<)不得以文字形式出现,除非用作标记分隔符,或在注释,处理指令或CDATA部分中。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串"&amp;""&lt;"进行转义。

因此,你必须改变XML和替换&通过&amp;

+0

有没有办法改变XML的编程?就像解析器加载数据一样,它会将'&'的所有实例更改为'&'? –

+0

没有,因为它涉及XMl,你没有XML,你必须改变文本或更好,因为迈克尔基说告诉你的供应商他们有一个错误,他们必须修复 – Mark

XML解析器是必需的,当你给他们没有良好的XML输入报告一个致命的错误。

找出程序生成这个损坏的数据并修复它。