gpt4 book ai didi

iphone - 如何处理 xml 中的所有元素?

转载 作者:行者123 更新时间:2023-11-28 22:33:46 25 4
gpt4 key购买 nike

我有一个这样的 xml,但我的 XMLParser 会跳转 1-2 个元素,而不处理它。我认为它工作正常,但事实并非如此。我做错了什么?

这是 xml,我想获取所有项目标签及其子元素。

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>News</title>
<description>News - Android</description>
<link>http://www.p.com</link>

<item>
<title>World Bench Press highlights - Day 2</title>
<pubDate>Tue, 21 May 2013 00:00:00 +0000</pubDate>
<imgLink>http://www.powerlifting-ipf.com/typo3temp/pics/1b7ecb3ac3.jpg</imgLink>
<description>desc </description>
<URL> some URL </URL>
</item>
</channel>
</item>
</rss>
</channel>

这是我的 XMLParser 文件,但我无法获取任何节点,而且它也没有放入我的数组中。不去if ([elementname isEqualToString:@"item"])

#import <Foundation/Foundation.h>
#import "XMLParser.h"

@implementation XMLParser
@synthesize tweets = _tweets;


NSMutableString *currentNodeContent;
NSMutableString *copy;
NSXMLParser *parser;
Tweet *currentTweet;
bool isStatus=YES;

-(id) loadXMLByURL:(NSString *)urlString
{
_tweets = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
NSLog(@"0");
return self;
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"1");
NSLog(@"currentnode %@",currentNodeContent);
currentNodeContent = [[NSMutableString alloc] initWithCapacity:100];

[currentNodeContent appendString:string];


}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"2 Elementname : %@",elementname);
if ([elementname isEqualToString:@"item"])
{
currentTweet = [Tweet alloc];
isStatus = YES;

}
if ([elementname isEqualToString:@"title"])
{
NSLog(@"%@",currentNodeContent);
currentTweet.content = [NSString stringWithFormat:@"%@ %@",currentTweet.content ,currentNodeContent];
}
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"ELEMENT: %@",elementname);

if ([elementname isEqualToString:@"description"])
{

currentTweet.description = currentNodeContent;

}

if ([elementname isEqualToString:@"pubDate"])
{

currentTweet.dateCreated = currentNodeContent;

}
if ([elementname isEqualToString:@"title"])
{

currentTweet.title = currentNodeContent;

}

if ([elementname isEqualToString:@"imgLink"])
{

currentTweet.imgLink = currentNodeContent;

}

if ([elementname isEqualToString:@"URL"])
{

currentTweet.URL = currentNodeContent;

}
if ([elementname isEqualToString:@"item"])
{
NSLog(@"%@ elem:",currentNodeContent);
[self.tweets addObject:currentTweet];
currentTweet = nil;
currentNodeContent = nil;
}
}
@end

最佳答案

您的方法是错误的,因为每次 XML 解析器发现新字符时您都在重新分配可变字符串。这意味着如果你得到一个像@"Hello"这样的字符串,并且字符串被解析为两个单独的字符串@"He"和@"llo",那么只有@"llo"被放入可变字符串中。正确的方法是每次找到新标签时分配一个新的可变字符串,而不是在找到新字符时分配一个新的可变字符串。

不确定,因为我不知道整个上下文,但我会尝试以这种方式编辑您的前两种方法:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"1");
NSLog(@"currentnode %@",currentNodeContent);
[currentNodeContent appendString:string];
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
currentNodeContent= [NSMutableString new];
NSLog(@"2 Elementname : %@",elementname);
if ([elementname isEqualToString:@"item"])
{
currentTweet = [Tweet alloc];
isStatus = YES;
}
}

让我知道你得到了什么结果。我还建议在每个方法中放置断点,以查看(在这种情况下)为什么会得到一些特定的字符串而不是预期的结果。

编辑

关于 XML,我尝试用 xmllint 检查它,但它有一些错误。问题在于关闭 channel 标签后的这两行额外内容:

</item> <!-- Not needed -->
</rss>
</channel> <!-- Not needed -->

关于iphone - 如何处理 xml 中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16699587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com