在iPhone中读取XML

时间:2011-05-14 14:20:33

标签: iphone xml xml-parsing

我有一个XML文件,如下所示:

<Statistics>
     <City ID="01">
          <Town ID="04">
               <Person ID="03" Name="Jack">
               </Person>
               <Person ID="04" Name="John">
               </Person>
               <Person ID="05" Name="Peter">
               </Person>
               <Person ID="06" Name="Daniel">
               </Person>
          </Town>
          <Town>
          ...
          </Town>
     </City>
     <City>
     ...
     </City>
</Statistics>

我想阅读这个XML文件并创建一个城市数组。在城市阵列内部我希望城镇阵列具有给定的ID和城镇阵列内部我希望有一个人员列表,我将在我的项目中使用他们的名字。 该系统将如下:返回居住在ID =“..”的城市的人和ID =“...”的城镇 例如:返回居住在CityID =“01”且TownID =“04”的人 名单将是[杰克,约翰,彼得,丹尼尔]。

有没有办法在iPhone SDK中这样做?如果有,你可以建议我这样做的方法或解释如何以最简单的方式做到这一点,因为我对这个环境很新。

非常感谢您收到的答案。

5 个答案:

答案 0 :(得分:10)

您正在寻找

NSXMLParser NSXMLParser Class Reference

这是一本好教程:Make NSXMLParser your friend

<小时/> 示例代码:

 NSString* XMLString = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>...";

 NSData* data = [XMLString dataUsingEncoding:NSUTF8StringEncoding]; 

 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]

 [parser setDelegate:self]; 
 [parser setShouldProcessNamespaces:NO]; 
 [parser setShouldReportNamespacePrefixes:NO];
 [parser setShouldResolveExternalEntities:NO]; 

 [parser parse]; 

您将需要此代表:

 parser:didStartElement:namespaceURI:qualifiedName:attributes:

并使用attribute类型的NSDictionary变量来读取标记属性:

 [[attributeDict objectForKey:@"id"] integerValue]
 [attributeDict objectForKey:@"Name"]

不要忘记将NSXMLParserDelegate协议添加到您的班级:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject <NSXMLParserDelegate> {
...

答案 1 :(得分:0)

最好的解决方案是使用您选择的xml解析器

如果您是iphone sdk和xcode等新手,为什么不使用php和简单的xml或xml2array?

你需要什么?一个应用程序?

答案 2 :(得分:0)

这是一个例子......

// RootView.h

@interface RootView : UIViewController <NSXMLParserDelegate> {
    NSXMLParser *xmlParser;
}

// AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    [rootView parseXmlFile:[[NSBundle mainBundle] pathForResource:@"Untitled" ofType:@"xml"]];
}

// RootView.m

- (void)parseXmlFile:(NSString *)pathToFile {
    BOOL success;
    NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile];
    if (xmlParser) // xmlParser is an NSXMLParser instance variable
        [xmlParser release];
    xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
    [xmlParser setDelegate:self];
    success = [xmlParser parse]; // return value not used
    // if not successful, delegate is informed of error
}

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

    if ([elementName isEqualToString:@"City"]) {
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"City"]) {
    }
}

答案 3 :(得分:0)

如果您可以控制XML(您是所有者)为什么不使用plist(使用XML顺便说一句)然后使用[NSArray arrayWithContentsOfFile:]将其作为数组/词组进行控制根据需要操纵NS结构。

答案 4 :(得分:0)

有多种XML解析选项可供iOS SDK选择。以下是对这些选项的良好解读:

http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project

您的问题听起来像是要使用XPath。如果是这种情况,那么可以采用TBXML或TouchXML。