Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
NSXMLParser跳过具有名称空间的元素_Xml_Cocoa_Nsxmlparser - Fatal编程技术网

NSXMLParser跳过具有名称空间的元素

NSXMLParser跳过具有名称空间的元素,xml,cocoa,nsxmlparser,Xml,Cocoa,Nsxmlparser,(tl;dr:见底部的摘要。) 我正在实现一个应用程序,它从单个站点的RSS提要中提取内容。以下是XML的一个示例: <item> <title>Title</title> <link>http://example.com</link> <comments>http://example.com/#comments</comments> <pubDate>Thu, 26 Jan 2012 03:05:1

(tl;dr:见底部的摘要。)

我正在实现一个应用程序,它从单个站点的RSS提要中提取内容。以下是XML的一个示例:

<item>
<title>Title</title>
<link>http://example.com</link>
<comments>http://example.com/#comments</comments>
<pubDate>Thu, 26 Jan 2012 03:05:11 +0000</pubDate>
<dc:creator>Billy D. Author</dc:creator> 
<category><![CDATA[sample_category]]></category>

<guid isPermaLink="false">http://example.com</guid>
<description><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras ac erat nec odio cursus accumsan. Nam feugiat hendrerit neque, nec tristique nisl ullamcorper vel. Nullam pellentesque augue metus. Vestibulum in lectus orci, eget ornare felis.&#8230;]]></description>
<content:encoded><![CDATA[<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras ac erat nec odio cursus accumsan. Nam feugiat hendrerit neque, nec tristique nisl ullamcorper vel. Nullam pellentesque augue metus. Vestibulum in lectus orci, eget ornare felis. Vestibulum nisl lacus, faucibus ac aliquet eu, pellentesque rutrum justo. Nulla fringilla venenatis augue a laoreet. Maecenas metus leo, euismod eget rutrum in, mattis eget nisi. Proin at massa sit amet odio tempor venenatis sit amet sit amet erat. Mauris vitae bibendum arcu. Curabitur a purus vitae ipsum ultricies luctus vel et velit.</p><p>Donec in lacus sit amet mi sagittis auctor eget nec nunc. Pellentesque adipiscing venenatis risus, a faucibus sem pretium quis. Nam fringilla metus eu nulla pellentesque semper. Quisque in lectus nisi. Fusce pretium accumsan purus nec sodales. Donec velit nisi, ullamcorper at faucibus vitae, lacinia quis dui. Duis eu dui leo, eget varius diam. Aliquam imperdiet volutpat tellus quis venenatis. Vivamus laoreet malesuada tincidunt. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris ut purus est. Sed quis mauris ut dolor dapibus vestibulum ut eu dolor. Cras interdum sagittis faucibus. Nulla tortor ligula, molestie at sollicitudin at, hendrerit et lacus. Nunc lorem enim, aliquet id porttitor ultrices, sodales ac sapien.</p>]]></content:encoded>
<wfw:commentRss>http://example.com/feed/</wfw:commentRss>
<slash:comments>0</slash:comments>
<enclosure url="http://example.com/some/other/stuff/>
</item>
并采取了以下措施:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    // NSLog(@"element %@, ns %@, qn %@", elementName, namespaceURI, qName);

    if ( [elementName isEqualToString:@"rss"] ) {
    return;
}

if ( [elementName isEqualToString:@"channel"] ) {
    // begin the set of entries
    if (!allEntries)
        allEntries = [NSMutableArray array];
    return;
}

if ( [elementName isEqualToString:@"item"] ) {
    // item means a new post!
    // currentPost = [[DIDSEntry alloc] init]; 
    return;
}

if ( [elementName isEqualToString:@"title"]) {
    [self setCurrentProperty:@"title"];
    currentPostTitle = [NSString string];
    return;
}

if ( [elementName isEqualToString:@"link"] ) {
    [self setCurrentProperty:@"url"];
    currentPostUrl = [[NSURL alloc] init];
    return;
}

if ( [elementName isEqualToString:@"pubDate"] ) {
    [self setCurrentProperty:@"date"];
    currentPostDate = [[NSDate alloc] init];
    return;
}

if ( [elementName isEqualToString:@"dc:creator"] ) {
    [self setCurrentProperty:@"author"];
    currentPostAuthor = [NSString string];
    return;
}

if ( [elementName isEqualToString:@"description"] ) {
    [self setCurrentProperty:@"preview"];
    currentPostPreview = [NSString string];
    return;
}

if ( [elementName isEqualToString:@"content:encoded"] ) {
    [self setCurrentProperty:@"text"];
    currentPostText = [NSString string];
    return;
}

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
    // currentStringValue is an NSMutableString instance variable
    currentStringValue = [[NSMutableString alloc] initWithCapacity:50];
}
[currentStringValue appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ( [elementName isEqualToString:@"rss"] ) {
    return;
}
if ( [elementName isEqualToString:@"channel"]) return;

if ( [elementName isEqualToString:@"item"] ) {
    currentPost = [[DIDSEntry alloc] initWithPostTitle:currentPostTitle postAuthor:currentPostAuthor postUrl:currentPostUrl pubDate:currentPostDate postPreview:currentPostPreview postText:currentPostPreview];
    [allEntries addObject:currentPost];
    return;
}
NSString *prop = [self currentProperty];

if ( [prop isEqualToString:@"title"] ) {
    [self setCurrentPostTitle:currentStringValue];
    // return;
}

if ( [prop isEqualToString:@"url"] ) {
    [self setCurrentPostUrl:[NSURL URLWithString:currentStringValue]];
    // return;
}

if ( [prop isEqualToString:@"date"] ) {
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss ZZZ"];
    [self setCurrentPostDate:[formatter dateFromString:currentStringValue]];
    // NSLog(@"date: %@", currentStringValue);
}

if ( [prop isEqualToString:@"author"] ) {
    [self setCurrentPostAuthor:currentStringValue];
    // return;
}

if ( [prop isEqualToString:@"preview"] ) {
    [self setCurrentPostPreview:currentStringValue];
    // return;
}

if ( [prop isEqualToString:@"text"] ) {
    [self setCurrentPostText:currentStringValue];
    // return;
}
// currentStringValue is an instance variable
currentStringValue = nil;

return;
}
我还实现了

- (void)parser:(NSXMLParser *)parser didStartMappingPrefix:(NSString *)prefix toURI:(NSString *)namespaceURI

但只记录他们被呼叫(他们是),因为我甚至不知道我该怎么处理他们

我一直在网络上寻找答案,来解释为什么我的代码会这样,以及如何修复它,但我完全不知所措。我试着测试限定名而不是元素名,去掉前缀,还有其他一些事情,但没有乐趣。(我也只是表面上理解XML名称空间,尽管我所看到的一切并没有真正说明我想要的东西。)

求和:


尝试使用名称空间解析元素并将其内容存储在实例变量中会导致先前解析的元素存储在这些IVAR中。我不知道为什么会这样,也不知道如何解决。

解决了。请原谅我,但很明显,这篇文章只与名称空间有关。在检查元素名称时,我确实去掉了名称空间前缀,在每次使用后将currentProperty字符串设置为nil,并注意到我正在将postText设置为CurrentPostReview。很抱歉很晚了

- (void)parser:(NSXMLParser *)parser didStartMappingPrefix:(NSString *)prefix toURI:(NSString *)namespaceURI
- (void)parser:(NSXMLParser *)parser didEndMappingPrefix:(NSString *)prefix