我正在解析一个简单的XML文件,但有时会在节点中包含包含&符号的标记。我做过一些研究here和here,但问题仍然存在。问题是解析器在遇到有问题的XML元素时会停止。 XML看起来像这样:
<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
。事实上,NSLog
的foundCharacters方法中的currentNodeContent
只是"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之外,还有其他方法吗?
答案 0 :(得分:4)
问题是你没有获得XML,并且解析器合法地陷入混乱,因为它看到的数据不合法。XML specification说
&符号(&amp;)和左尖括号(&lt;)不得以其文字形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串
"&"
和"<"
进行转义。
因此,您必须更改XML并替换&amp;按&
答案 1 :(得分:0)
当您为XML输入提供格式不正确的XML时,需要XML解析器报告致命错误。
找出哪个程序生成了这个损坏的数据并修复它。