我有一个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中这样做?如果有,你可以建议我这样做的方法或解释如何以最简单的方式做到这一点,因为我对这个环境很新。
非常感谢您收到的答案。
答案 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。