NSXML解析Ampersand字符导致关闭

时间:2013-08-20 23:12:33

标签: objective-c xml parsing nsstring ampersand

我正在解析一个简单的XML文件,但有时会在节点中包含包含&符号的标记。我做过一些研究herehere,但问题仍然存在。问题是解析器在遇到有问题的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:@"&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之外,还有其他方法吗?

2 个答案:

答案 0 :(得分:4)

问题是你没有获得XML,并且解析器合法地陷入混乱,因为它看到的数据不合法。XML specification

  

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

因此,您必须更改XML并替换&amp;按&amp;

答案 1 :(得分:0)

当您为XML输入提供格式不正确的XML时,需要XML解析器报告致命错误。

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