objective-c - 问题: Parsing XML File in Objective-C/Cocoa Project for iOS

标签 objective-c cocoa ios delegates nsxmlparser

在寻找解决我的错误的解决方案几天后, 我想与你分享整个问题。也许有人有更好的想法来解决这个问题。

我的项目使用 TabViewController 在 View 之间切换。 对于每个 Tabview,我加载一个单独的类文件以使其更加清晰。

我需要的 View 的所有内容都来自 XML 文件。我通过 URL 获取它们。 结构如下所示:

<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <Slice id=1>
            <image>www.testurl.com/test.jpg</img>
            <title>Sample Title #1</title>
            <text>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</text>
        </Slice>

        <Slice id=2>
            <image>www.testurl.com/test2.jpg</img>
            <title>Sample Title #2</title>
            <text>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy</text>
        </Slice>
    </channel>
</rss>

我为每个 View 单独获取这样一个文件,其中包含我想要在 View 中显示的网站内容。

我尝试了一些 xml 解析教程,并找到了一种解析我的文件并将其显示在 TableView 中的方法。它工作正常,但是当我尝试在我的项目中实现这些文件时,使用委托(delegate)会出现几个问题。

我的项目中已经有一个委托(delegate)来管理导航。现在我有第二个委托(delegate),管理 XML 解析器,但我仍然不知道如何使第二个委托(delegate)在我的 View 中工作。

我发现的每个教程都使用项目委托(delegate),但如果我已经有了一个委托(delegate)并且只想在我的项目中添加 XML 解析器,该怎么办?

我对在 Google 中破解关键字感到疯狂,但没有找到与我的问题相关的任何内容。这是我的求助电话。 =D

我的问题: 有没有什么简单的方法可以将动态 xml 解析器添加到我的项目中,当我将 URL 发送到解析器时,它会返回一个包含内容的数组? 我只想在 ViewController 中定义 URL 并从 XML 中获取内容。

希望你理解我的问题。我将不胜感激每一个可以帮助我的答案。

最佳答案

嗯...也许您的困惑在于委托(delegate)模式。

委托(delegate)只是一个代替另一个对象接收消息的对象。将其视为回调机制。

我的建议是创建一个单独的类来解析 XML 文件,如下所示:

@interface  MyXMLParser : NSObject<NSXMLParserDelegate>

此类有一个 NSMutableArray 结果和一个解析方法。

解析方法将如下所示:

-(void) parse:(NSString *)xmlFilePath
{
  self.results  = [[NSMutableArray alloc] init];  

  NSURL* xmlURL = [NSURL fileURLWithPath:xmlFilePath];
  NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
  parser.delegate = self;  
  [parser parse];
  [parser release];
}

在此类中,您还需要实现委托(delegate)方法。这些方法将在 [parser parse] 调用中调用,对于 xml 文件中找到的每个元素调用一次:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 

在这些方法中,您需要“理解”获得的元素并将它们存储在结果数组中。

你像这样使用这个解析器

MyXMLParser* parser = [[MyXmlParser alloc] init];
[parser parse:@"myfile.xml"]
NSLog(@"%@", parser.results);
[parser release];

希望对您有所帮助。

关于objective-c - 问题: Parsing XML File in Objective-C/Cocoa Project for iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153340/

相关文章:

ios - mergExt - 在 iOS 上使用 mergSettings 本地化应用程序

ios - 初始化托管对象时未插入托管对象上下文时,核心数据对象属性为零

ios - ARC、自身和 block

objective-c - 实现 NSOutlineView 来编辑 plist 文件的内容

swift - 在非沙盒中使用 Cocoa NSSavePanel 会导致断言失败

iphone - 关于在 iPhone 上更新 UITableViewCell 的问题

ios - xib 的 UIControl 在 ios 7.1 上崩溃

objective-c - 我应该在哪里以及如何实例化一个将在 IOS 应用程序中全局使用的对象?

iphone - 显示禁用位置服务的用户位置

ios - SetValue 未按预期运行