首页 文章

解析XML CDATA块

提问于
浏览
5

我打电话给我,我无法理解为什么 . 我知道我的解析器设置正确,因为解析器:foundCharacters:方法工作正常 . 我试图解析的XML数据看起来像这样http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4,CDATA块出现在属性名称为"description"的元素内 .

任何有关为什么不调用该方法的帮助将不胜感激!

编辑:我在描述CDATA块上运行了解析器:foundCharacters:方法,它返回“<” . 我假设这意味着解析器没有正确地看到CDATA标签 . 我可以做些什么来解决这个问题吗?

1 回答

  • 2

    看来 <fact> 标签中的CDATA内容将在 parser:foundCharacters 中的多个回调中逐步返回 . 在符合NSXMLParserDelegate的类中,尝试通过将CDATA附加到NSMutableString实例来构建CDATA,如下所示:

    (注意:这里_currentElement是NSString属性,_factString是NSMutableString属性)

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {    
        self.currentElement = elementName;
        if ([_currentElement isEqualToString:@"fact"]) {
            // Make a new mutable string to store the fact string
            self.factString = [NSMutableString string];
        }
    
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if ([elementName isEqualToString:@"fact"]) {
            // If fact string starts with CDATA tags then just get the CDATA without the tags
            NSString *prefix = @"<![CDATA[";
            if ([_factString hasPrefix:prefix]) {
                NSString *cdataString = [_factString substringWithRange:NSMakeRange((prefix.length+1), _factString.length - 3 -(prefix.length+1))];
                // Do stuff with CDATA here...
                NSLog(@"%@", cdataString);
                // No longer need the fact string so make a new one ready for next XML CDATA
                self.factString = [NSMutableString string];
    
            }
        }
    
    }
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
        if ([_currentElement isEqualToString:@"fact"]) {
            // If we are at a fact element, append the string
            // CDATA is returned to this method in more than one go, so build the string up over time
            [_factString appendString:string];
        }
    
    }
    

相关问题