在網上查了很多這樣的資料,都大差不差的簡單寫了下,今天我也完成了一份,內容被我簡化了,主要是講如何用吧,大家如果看了有任何的問題和見解,歡迎給我留言。
XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<config>
<star>
<categorys>
<default>
<category value="00">娛樂</category>
...
</default>
<en>
<category value="00">entertainment</category>
...
</en>
</categorys>
<genders><!-- 性別 -->
<default>
<gender value="1">男</gender>
...
</default>
<en>
<gender value="1">male</gender>
...
</en>
</genders>
<comments><!-- 評論 -->
<default><!-- 默認語言 -->
<score min="90" max="100">
<comment>&&&</comment>
...
</score>
<score min="80" max="90">
<comment>$$$</comment>
...
</score>
...
</default>
</comments>
</star>
<beauty><!-- 美麗指數 -->
<comments><!-- 評論 -->
<default><!-- 默認語言 -->
<score min="90" max="100">
<comment>&&&</comment>
...
</score>
<score min="80" max="90">
<comment>%%%</comment>
...
</score>
...
</default>
</comments>
</beauty>
</config>
XMLParser方法
NSMutableArray*parserObjects;
NSMutableDictionary*dataDict;
NSString *m_strCurrentElement;
NSMutableString *tempString;
-(id)init
{
if ([super init]){
;
}
return self;
}
- (void)parseXML:(NSData *)xmlFile parseError:(NSError **)error
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlFile];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse]; <開始解析>
NSError *parseError = [parser parserError];
if (parseError && error) {
*error = parseError;
}
[parser release];
}
- (void)dealloc
{
[m_strCurrentElement release];
[tempString release];
[super dealloc];
}
準備解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
parserObjects = [[NSMutableArray alloc] init];
}
準備解析節點
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"config"]) {
[dataDict release];
dataDict = [[NSMutableDictionary alloc] initWithCapacity:0];
}
else if ([elementName isEqualToString:@"en"]){
typeFlag = TRUE;
}
else if ([elementName isEqualToString:@"default"]){
typeFlag = FALSE;
}
else if (([elementName isEqualToString:@"category"]) && (typeFlag == FALSE)) {
starTypeFlag = FALSE;
self.m_strCurrentElement = [attributeDict objectForKey:@"value"];
self.tempString = [NSMutableString string];
[typeValArray addObject:self.m_strCurrentElement];
}
else {
;
}
}
獲取首尾節點間內容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (m_strCurrentElement) {
[self.tempString appendString:string];
[dataDict setObject:string forKey:m_strCurrentElement];
if (typeFlag == FALSE) {
...
}
else {
...
}
}
}
解析完當前節點
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if (m_strCurrentElement) {
[dataDict setObject:self.tempString forKey:m_strCurrentElement];
self.m_strCurrentElement = nil;
self.tempString = nil;
}
if ([elementName isEqualToString:@"config"]) {
if (dataDict) {
[parserObjects addObject:dataDict];
}
}
}
這個XML中,有點要注意的就是,【default】【en】的子節點的名字都叫做【category】,但他們肯定不會是在同一個時候解析出來的。這下我們可以用上面藍色部分(一個BOOL類型的變量標記一下就行了),在下面獲取內容的時候也只要判斷一下就OK了