0

我正在解析一个简单的 XML 文件,但有时在节点中有包含与号 (&) 的标签。我在这里这里做了一些研究,但问题仍然存在。问题是解析器在遇到有问题的 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。实际上,NSLogfoundCharacters 方法中的 ancurrentNodeContent就是"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 之外,还有其他方法吗?

4

2 回答 2

4

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

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

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

于 2013-08-20T23:18:25.267 回答
0

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

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

于 2013-08-21T08:42:09.937 回答