0

ユーザー入力に基づいてファイルから xml データの一部を取得するためのアプリケーションを開発する予定です。私のコードはxmlファイルのコンテンツを取得するのにうまく機能しますが、パーサーに、たとえば内部にあるすべての要素を提供するように依頼する最良の方法がわかりません(intake name="TMF1202")...ユーザーはインテーク名を入力として指定すると、パーサーはそのインテーク タグにのみ存在する要素を取得します。これが私のパーサー コードです。

#import "Parser.h"
#import "TimeTableViewController.h"

@implementation Parser
@synthesize currentElementPointer, rootElement;

-(id)initParser
{
    if(self = [super init]) {
        tvc = (TimeTableViewController*)[[UIApplication sharedApplication]delegate];
    }
    return self;
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{

    if(self.rootElement == nil) {
        self.rootElement = [[List alloc]init];
        self.currentElementPointer = self.rootElement;
    } else {
        List *newList = [[List alloc]init];
        newList.parent = self.currentElementPointer;
        [self.currentElementPointer.subElements addObject:newList];
        self.currentElementPointer = newList;
    }

    self.currentElementPointer.name = elementName;
    self.currentElementPointer.attributes = attributeDict;

    // theList.intake = [[attributeDict objectForKey:@"name"]stringValue];
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if([self.currentElementPointer.text length] > 0) {
        self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string];
    } else {
        self.currentElementPointer.text = string;
    }
}


-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    self.currentElementPointer = self.currentElementPointer.parent;
}

@end

これは私のXMLファイルの構造です:

XML 形式

4

1 に答える 1

3

このパーサーをそのように機能させたいが、属性が と等しくないintake要素であるXML ドキュメントの要素 (またはサブ要素) を単純に解析しないと仮定すると、木かどうか。たとえば、1 つのアプローチは次のようになります。nameTMF1202BOOL

  1. BOOL現在解析しているかどうかを指定するプロパティを作成します。

    @property (nonatomic, getter = isParsing) BOOL parsing;
    
  2. 必ず初期化してください。

    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
        self.parsing = YES;
    }
    
  3. と等しくないに遭遇した場合、intakeその値をクリアできます。おそらく次のようになります。nameTMF1202didStartElementBOOL

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"intake"])
        {
            NSString *name = attributeDict[@"name"];
            self.parsing = [name isEqualToString:@"TMF1202"];
        }
    
        if (![self isParsing]) return;
    
        // the rest of your standard parsing routine goes here
    }
    
  4. 明らかに、次のfoundCharactersことも確認する必要がありますisParsing

    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        if (![self isParsing]) return;
    
        // the rest of your standard foundCharacters goes here
    }
    
  5. そしてdidEndElement、(a)次の場合にのみ標準的なことを行う必要がありdidEndElementますisParsing。(b) それ以外の場合、フラグのintakeリセットを終了する場合:parsing

    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if ([self isParsing])
        {
            // do your standard didEndElement stuff here
        }
        else if ([elementName isEqualToString:@"intake"])
        {
            // otherwise, if we're ending an `intake`, then go ahead and turn parsing back on
    
            self.parsing = YES;
        }
    }
    

詳細は異なる場合があります (これに取り組む方法はたくさんあります) が、これは 1 つのアプローチです。

于 2013-08-01T16:50:58.983 に答える