2

NSXMLParserを使用して、次の構造で XML を解析しています。

<characters>
    <character>
        <literal>本&lt;/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];
    }
}

ご覧いただきありがとうございます。

4

1 に答える 1

0

問題は、実際の値を currentElementValue に読み込む前にcurrentElementValue_codepointに追加していることです。つまり、 cp_valueの開始時に追加しています。デリゲート メソッドの_codepointcurrentElementValueを追加する必要があります。その後、期待される結果が得られます。コードを次のように変更します。didEndElement:

- (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です。あなたの場合、ucsjis208

于 2013-01-23T07:27:22.760 に答える