Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 解析XML CDATA块_Objective C_Xml_Parsing_Nsxmlparser_Cdata - Fatal编程技术网

Objective c 解析XML CDATA块

Objective c 解析XML CDATA块,objective-c,xml,parsing,nsxmlparser,cdata,Objective C,Xml,Parsing,Nsxmlparser,Cdata,我正在尝试解析网站librarything.com上的一个XML文件(使用NSXMLParser)。这是我解析过的第一个文件,但在大多数情况下,它似乎相当直截了当。我的问题发生在尝试解析CDATA块时;方法parser:foundCDATA:未被调用,我不明白为什么。我知道我的解析器设置正确,因为parser:foundCharacters:method工作正常。我试图解析的XML数据如下所示,CDATA块出现在属性名为“description”的元素中 任何关于为什么不调用该方法的帮助都将不胜

我正在尝试解析网站librarything.com上的一个XML文件(使用NSXMLParser)。这是我解析过的第一个文件,但在大多数情况下,它似乎相当直截了当。我的问题发生在尝试解析CDATA块时;方法parser:foundCDATA:未被调用,我不明白为什么。我知道我的解析器设置正确,因为parser:foundCharacters:method工作正常。我试图解析的XML数据如下所示,CDATA块出现在属性名为“description”的元素中

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


编辑:我在description CDATA块上运行parser:foundCharacters:方法,它返回“在
parser:foundCharacters
中,
标记中的CDATA内容似乎是通过多次回调递增返回的。在符合NSXMLParserDelegate的类中,尝试通过将CDATA附加到NSMutableString实例来构建CDATA,如下所示:

(注意:此处_currentElement是NSString属性,_factString是NSMutableString属性)

-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName属性:(NSDictionary*)attributeDict{
self.currentElement=elementName;
if([\u currentElement IsequalString:@“事实”]){
//创建一个新的可变字符串来存储事实字符串
self.factString=[NSMutableString];
}
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
if([elementName IsequalString:@“事实”]){
//如果事实字符串以CDATA标记开头,那么只需获取不带标记的CDATA即可
NSString*前缀=@“
- (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];
    }

}