私はこのような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の基本は知っていますが、条件付き解析を実現する方法がわかりません。
ありがとうございました。
- (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;
}
}
このようなもの。コンパイラでこのコードを実際にテストしたことがないので、あちこちで構文エラーが発生することに注意してください。
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は非常に便利でコンパクトであることがわかりました。
お役に立てれば。
XMLの解析には、事実上2つのアプローチがあります。イベント駆動型アプローチ(NSXMLParserで使用されるアプローチなど)とツリーアプローチ(NSXMLで使用されるアプローチなど)です。
特定の要素のみを対象としている場合は、XPath(および実際にはXQuery)を使用してXMLドキュメントにクエリを実行し、特定のノードなどを返すことができるため、NSXMLで使用されるツリーアプローチを使用する方がはるかに簡単です。あなたが興味を持っている。
NSXMLParserを使用して構造全体を反復処理するよりも実り多いアプローチのように思われる場合は、 CocoaのツリーベースXMLプログラミングガイドの概要 を読むことをお勧めします。 (「XMLドキュメントのクエリ」セクションは特に興味深いはずです。)