NSXMLParserを使用して、次の構造で XML を解析しています。
<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>
要素の attribute_value をキーとして使用し、cp_value
要素の値 (例: 672c) を値として使用して、このキーと値のペアを my に配置したいと考えてい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];
}
}
ご覧いただきありがとうございます。