【发布时间】:2013-08-23 04:10:22
【问题描述】:
我正在解析一个简单的 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。其实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 或者是否可以在解析器中以编程方式进行?
-
@Jeremy 抱歉忘记标记...
标签: objective-c xml parsing nsstring ampersand