【问题标题】:Xml Parsing Issue in iPhoneiPhone 中的 Xml 解析问题
【发布时间】:2012-09-28 08:14:50
【问题描述】:
<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;
 }

【问题讨论】:

  • 向我们展示代码,你能修复它吗?当你开始状态事件时,你可以检查它是“空闲”还是“拖动”对吗?
  • 如果您能向您展示代码或类似代码会更好,这将有助于我们了解您的确切要求。
  • 你在使用任何 xml 解析器吗?
  • @AppleDelegate 是的,我正在使用 NsXmlparser
  • @vishy 我正在更新我的问题

标签: iphone ios5 xml-parsing


【解决方案1】:

您评论的这段代码似乎没问题:

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

stateID 第一次显示空闲,第二次显示拖动。

xml从上到下读取

对于&lt;state&gt; 或类似标签,您必须使用if ([elementName isEqualToString:@"state"])

对于像 target=""、event="" 或 id="" 等标签内的属性,您必须使用 [attributeDict objectForKey:@"target"];

您不必做任何特别的事情,当解析器完成第一个&lt;/state&gt; 时,它将继续处理下一个&lt;state&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多