2013-01-23 27 views
2

XML屬性元素值解析我的XML結構如下:如何設置鍵值對中的NSMutableDictionary因爲我使用<strong>的NSXMLParser</strong>使用的NSXMLParser

<characters> 
    <character> 
     <literal>本</literal> 
     <codepoint> 
      <cp_value cp_type="ucs">672c</cp_value> 
      <cp_value cp_type="jis208">43-60</cp_value> 
     </codepoint> 
    </character> 
</characters> 

我想用cp_value元素的attribute_value作爲鍵和元素值(例如672c)作爲值並將此鍵值對放置在我的NSMutableDictionary*_codepoint中。解析後,我想要的結果(在控制檯)看起來像這樣:

_codepoint: { 
"ucs"=672c; 
"jis208"=43-60; 
} 

正如我已經實現瞭解析器(代碼如下),我得到這個早在控制檯:

2013-01-22 22:12:46.199 MyApp[13391:c07] _codepoint: { 
ucs = "\n  \n   "; 
} 
2013-01-22 22:12:46.201 MyApp[13391:c07] _codepoint: { 
    jis208 = "\n  \n   672c\n   "; 
} 

首先 - 值和鍵不同步,其次,jis208元素的值未被讀入。其次,我不確定這些\ n和空格是什麼。任何人都可以提出一些建議嗎?

我寫的代碼是:

- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"characters"]) { 
     appDelegate.characters = [[NSMutableArray alloc] init]; 
    } else if ([elementName isEqualToString:@"character"]) { 
     aCharacter = [[Character alloc] init]; 
    } else if ([elementName isEqualToString:@"cp_value"]) { 
     if (!_codepoint) _codepoint = [[NSMutableDictionary alloc] init]; 
     [_codepoint setValue:currentElementValue forKey:[attributeDict valueForKey:[[attributeDict allKeys] lastObject]]]; 
     NSLog(@"_codepoint: %@", _codepoint); 
    } 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if (!currentElementValue) { 
     currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    } else { 
     [currentElementValue appendString:string]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"characters"] 
     // cp_values will be copied from a local NSMutableDictionary *_codepoint 
     || [elementName isEqualToString:@"codepoint"] 
     ) return;  
    if ([elementName isEqualToString:@"character"]) { 
     [appDelegate.characters addObject:aCharacter]; 
     [aCharacter release]; 
    } else if ([elementName isEqualToString:@"cp_value"]){ 
     [aCharacter.codepoint addObject:_codepoint]; 
    } 
} 

非常感謝您的期待。

+0

試試我的答案.. –

+0

我做到了。成功了!非常感謝你。 –

回答

0

問題是,你正在閱讀的實際價值爲currentElementValue即你當cp_value開始在加入之前加入currentElementValue_codepoint。你應該在didEndElement:委託添加currentElementValue_codepoint method.Then你會得到預期的result.Modify你這樣的代碼:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"characters"]) { 
     appDelegate.characters = [[NSMutableArray alloc] init]; 
    } else if ([elementName isEqualToString:@"character"]) { 
     aCharacter = [[Character alloc] init]; 
    } else if ([elementName isEqualToString:@"cp_value"]) { 
     if (!_codepoint) _codepoint = [[NSMutableDictionary alloc] init]; 
    currentAttributeKey = [[NSMutableString alloc]initWithString:[attributeDict valueForKey:[[attributeDict allKeys] lastObject]]]; 
} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if (!currentElementValue) { 
     currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    } else { 
     [currentElementValue appendString:string]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"characters"] || [elementName isEqualToString:@"codepoint"]) 
     return;  
    if ([elementName isEqualToString:@"character"]) { 
     [appDelegate.characters addObject:aCharacter]; 
     [aCharacter release]; 
    } else if ([elementName isEqualToString:@"cp_value"]){ 
     [_codepoint setValue:[[currentElementValue componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:@""] forKey:currentAttributeKey]; 
     currentElementValue = [[NSMutableString alloc]init]; 
     NSLog(@"_codepoint: %@", _codepoint); 
     [aCharacter.codepoint addObject:_codepoint]; 
    } 
} 

其中currentAttributeKey是的NSMutableString將存儲attributes.In您案例ucsjis208

+0

Pratyusha,非常感謝!您的解決方案完美運作我仍然想了解\ n和所有這些空白。爲什麼在控制檯中獲得輸出? –

+1

我的榮幸。在元素開始之後找到一個字符後,你將它附加到'currentElementValue'.After每個標籤例如'characters'後面有一個新行,所以\ n被附加到'currentElementValue'.thank u接受:) –

+0

對不起已經很晚了,但是謝謝你 - 這是完全正確的。 –

相關問題