【问题标题】:NSXML Parsing Ampersand Character Causes Shut DownXML 解析 & 字符导致关闭
【发布时间】:2013-08-23 04:10:22
【问题描述】:

我正在解析一个简单的 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。其实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:@"&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 之外,还有其他方法吗?

【问题讨论】:

  • 在将数据提供给解析器之前,对 & 符号进行编码。
  • 如何对数据中的 & 符号进行编码?这是否意味着更改 XML 或者是否可以在解析器中以编程方式进行?
  • @Jeremy 抱歉忘记标记...

标签: objective-c xml parsing nsstring ampersand


【解决方案1】:

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

找出产生这些损坏数据的程序并修复它。

【讨论】:

    【解决方案2】:

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

    & 符号 (&) 和左尖括号 ("&amp;" 和"&amp;lt;" 对其进行转义。

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

    【讨论】:

    • 有没有办法以编程方式更改 XML?就像解析器加载数据一样,它会将&amp;amp; 的所有实例更改为&amp;amp;
    • 不,因为它处理 XMl 并且您没有 XML,您必须更改文本或更好,因为 Michael Key 告诉您的供应商他们有一个必须修复的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多