web-dev-qa-db-ja.com

NSXMLParserの例

私はこのようなXMLを持っています

<IS>
    <Value>
        <Signature>-804</Signature>
        <Amount>139</Amount>
    </Value>
    <Value>
        <Signature>-845</Signature>
        <Amount>639466</Amount>
    </Value>
    <Value>
        <Signature>-811</Signature>
        <Amount>16438344</Amount>
    </Value>
    <Value>
        <Signature>-1115</Signature>
        <Amount>-159733</Amount>
    </Value>
</IS>

ここで、これから特定の値のみを解析したいと思います。たとえば、対応する署名が-804であるノードの値を取得するにはどうすればよいですか。

私を助けてください..

NSXMLParserの基本は知っていますが、条件付き解析を実現する方法がわかりません。

ありがとうございました。

10
testndtv
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    currentKey = nil;
    [currentStringValue release];
    currentStringValue = nil;
    if([elementName isEqualToString:@"Value"]){
        //alloc some object to parse value into
    } else if([elementName isEqualToString:@"Signature"]){
        currentKey = @"Signature";
        return;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if(currentKey){
        if(!currentStringValue){
            currentStringValue = [[NSMutableString alloc] initWithCapacity:200];
        }
        [currentStringValue appendString:string];
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if([elementName isEqualToString:@"Signature"] && [currentStringValue intValue] == 804){
        ivar.signature = [currentStringValue intValue];
        return;
    }
}

このようなもの。コンパイラでこのコードを実際にテストしたことがないので、あちこちで構文エラーが発生することに注意してください。

10
Asad Khan

TouchXMLの使用を検討することをお勧めします--- https://github.com/mrevilme/TouchXML これは、XPATHの使用を含むいくつかの優れたXML処理機能を提供し、実行しようとしていることをはるかに簡単にします。

モデルに基づく架空の例:

//first, load an XML document
CXMLDocument *xmlDoc = [[CXMLDocument alloc] initWithXMLString:someXMLString options:0 error:&error];

//get node
CXMLNode *amountNode = [xmlDoc nodeForXPath:@"//Value[@Signature='-804']/Amount" error:&error];

//or get actual value of node
NSSString *amountString =  = [[xmlDoc nodeForXPath:@"//Value[@Signature='-804']/Amount" error:&error] stringValue];

注:これらの例はいずれもテストされていません。

TouchXMLは非常に便利でコンパクトであることがわかりました。

お役に立てれば。

6
dredful

XMLの解析には、事実上2つのアプローチがあります。イベント駆動型アプローチ(NSXMLParserで使用されるアプローチなど)とツリーアプローチ(NSXMLで使用されるアプローチなど)です。

特定の要素のみを対象としている場合は、XPath(および実際にはXQuery)を使用してXMLドキュメントにクエリを実行し、特定のノードなどを返すことができるため、NSXMLで使用されるツリーアプローチを使用する方がはるかに簡単です。あなたが興味を持っている。

NSXMLParserを使用して構造全体を反復処理するよりも実り多いアプローチのように思われる場合は、 CocoaのツリーベースXMLプログラミングガイドの概要 を読むことをお勧めします。 (「XMLドキュメントのクエリ」セクションは特に興味深いはずです。)

4
John Parker