NSXML分析和符号导致关机
我正在解析一个简单的XML文件,但是有时在节点中存在包含与符号(&)的标签。我已经做了一些研究here和here,但问题仍然存在。问题在于解析器在遇到有问题的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:@"&"];
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之外,有没有办法解决这个问题?
的问题是,你还没有被赋予XML和解析器乱七八糟合法获得,因为它看到的数据是不合法的。该XML specification说
与符号字符(&)和左尖括号(<)不得以文字形式出现,除非用作标记分隔符,或在注释,处理指令或CDATA部分中。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串
"&"
和"<"
进行转义。
因此,你必须改变XML和替换&通过&
有没有办法改变XML的编程?就像解析器加载数据一样,它会将'&'的所有实例更改为'&'? –
没有,因为它涉及XMl,你没有XML,你必须改变文本或更好,因为迈克尔基说告诉你的供应商他们有一个错误,他们必须修复 – Mark
XML解析器是必需的,当你给他们没有良好的XML输入报告一个致命的错误。
找出程序生成这个损坏的数据并修复它。
在将数据提供给解析器之前,请对符号进行编码。 – Jeremy
你如何从数据中对&符号进行编码?这是否意味着改变XML或者是否有可能在解析器中以编程方式执行它? –
@Jeremy对不起忘了标签... –