2
<scxml 
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
profile="ecmascript"
initial="idle">

<state id="idle">
    <transition event="mousedown" target="dragging"/>
</state>

<state id="dragging">
    <transition event="mouseup" target="idle"/>
    <transition event="mousemove" target="dragging"/>
</state>

</scxml>

アプリケーションを起動するときにこのxmlを解析したいのですが、「アイドル」という初期状態に入り、イベントが完了したら、次の状態を「ドラッグ」に移動したいと思います。これどうやってするの?

次の方法でNSXmlparserを使用しています。

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"scxml"])

{
    stateID = [attributeDict objectForKey:@"initital"];
    stateInfo = [[StateInfo alloc]initWithStateName:stateID];
    return;

}
if ([elementName isEqualToString: @"state"] ){

    if ([[attributeDict objectForKey:@"transition"] isEqualToString:@"idle"])  {

    }
    else {

    }
}
//    if ([elementName isEqualToString:@"state"]) {
////        stateID = [attributeDict objectForKey:@"id"];
////        stateInfo = [[StateInfo alloc]initWithStateName:stateID];
////        NSLog(@"stateID = %@",stateID);
//        return;
//    }
if([elementName isEqualToString:@"transition"]){
    //aList=[[List alloc]init];
    stateID = [attributeDict objectForKey:@"target"];
    targetStateInfo = [[StateInfo alloc]initWithStateName:stateID];
    [stateInfo registerNextState:targetStateInfo withCondition:[attributeDict objectForKey:@"cond" ]];
    return;
}
if ([elementName isEqualToString:@"scxml"])

    {
    stateID = [attributeDict objectForKey:@"initital"];
    stateInfo = [[StateInfo alloc]initWithStateName:stateID];
    return;

  }
if ([elementName isEqualToString: @"state"] ){

    if ([[attributeDict objectForKey:@"Name"] isEqualToString:@"Child2"])  {
        // searchDone=YES;
    }
    else {
        // searchDone=NO;

    }
}
//    if ([elementName isEqualToString:@"state"]) {
////        stateID = [attributeDict objectForKey:@"id"];
////        stateInfo = [[StateInfo alloc]initWithStateName:stateID];
////        NSLog(@"stateID = %@",stateID);
//        return;
//    }
if([elementName isEqualToString:@"transition"]){
    //aList=[[List alloc]init];
    stateID = [attributeDict objectForKey:@"target"];
    targetStateInfo = [[StateInfo alloc]initWithStateName:stateID];
    [stateInfo registerNextState:targetStateInfo withCondition:[attributeDict objectForKey:@"cond" ]];
    return;
  }

}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if(!currentElementValue){
    currentElementValue=[[NSMutableString alloc]init];
}
[currentElementValue appendString:string];
//currentElementValue = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 /* if(!currentElementValue)
 currentElementValue = [[NSMutableString alloc] init];
 else
 [currentElementValue appendString:string];
 */

/ * if(self.currentElementValue){[self.currentElementValue appendString:string]; } */}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"scxml"])
    return;
if([elementName isEqualToString:@"state"]){
    //[aList setTitle:currentElementValue];
    //NSLog(@"alist.title = %@",aList.title);
}
    currentElementValue = nil;
 }
4

1 に答える 1

0

あなたがコメントしたこのコードは問題ないようです:

if ([elementName isEqualToString:@"state"]) {
        stateID = [attributeDict objectForKey:@"id"];
        stateInfo = [[StateInfo alloc]initWithStateName:stateID];
        NSLog(@"stateID = %@",stateID);
}

stateIDは、最初はアイドル状態で、2回目はドラッグしていることを示します。

xmlは上から下に読み取られます

使用する<state>必要のあるタグまたは同様のタグif ([elementName isEqualToString:@"state"])

target = ""、event = ""、id = ""などのタグ内の属性には、使用する必要があります[attributeDict objectForKey:@"target"];

特別なことをする必要はありません。パーサーが最初</state>に終了すると、次のパーサーに進み<state>ます。

于 2012-10-08T07:23:38.727 に答える