1

我的问题很简单。我正在解析 XML,NSXML 的解析过程非常好。我把所有的声音放在一些数组中,现在我正在用它组成一个字符串。我的问题是,如果我以这种方式编写 XML ......

<main>
  <introductions>
    <text>Text 01</text> 
    <text>Text 02</text>
  </introductions>
</main>

...我将 2 个字符串附加到我获得的情节提要上的标签中:

Text 01
Text 02

我试图弄清楚那条新线来自哪里,所以我尝试了一些东西,我发现这个 XML ......

<main>
  <introductions>
    <text>Text 01</text> <text>Text 02</text>
  </introductions>
</main>

...产生...

Text 01 Text 02

为什么这个?为什么 NSXML 正在读取标签之外的内容?我怎样才能避免这种情况?

如果有帮助,这就是我初始化解析器的方式:

 NSURL *xml = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"frasi" ofType:@"xml"]];
xmlParser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfURL:xml]];
[xmlParser setDelegate:self];
[xmlParser setShouldProcessNamespaces:NO];
[xmlParser setShouldReportNamespacePrefixes:NO];
[xmlParser setShouldResolveExternalEntities:NO];
[xmlParser parse];

这是其余的代码(对于我真正的 XML):

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
  qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict{
    currentElement = [elementName copy];

    if ([currentElement isEqualToString:@"introduzioni"] || [currentElement isEqualToString:@"soggetti"]
        || [currentElement isEqualToString:@"verbi"] || [currentElement isEqualToString:@"luoghi"]){
        ++depth;
        //[self showCurrentDepth];
        NSLog(@"Sezione %@", elementName);
        sezione = [[NSString alloc] init];
        sezione = currentElement;
    }
    else if ([currentElement isEqualToString:@"testo"]){
        currentName = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
  qualifiedName:(NSString *)qName{

    if ([elementName isEqualToString:@"introduzioni"] || [elementName isEqualToString:@"soggetti"]
        || [elementName isEqualToString:@"verbi"] || [elementName isEqualToString:@"luoghi"]){
        --depth;
        //[self showCurrentDepth];
    }
    else if ([elementName isEqualToString:@"testo"]){
        if (depth == 1){
          NSLog(@"Testo: %@", currentName);
            if([sezione isEqualToString:@"introduzioni"])
                [arrayIntroduzioni addObject:currentName];
            if([sezione isEqualToString:@"soggetti"])
                [arraySoggetti addObject:currentName];
            if([sezione isEqualToString:@"verbi"])
                [arrayVerbi addObject:currentName];
            if([sezione isEqualToString:@"luoghi"])
                [arrayLuoghi addObject:currentName];
        }
    }
}        

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if ([currentElement isEqualToString:@"testo"]){
        [currentName appendString:string];
    } 
}

4

1 回答 1

1

委托方法parser:foundCharacters:将提供所有字符数据,即您要查找的数据以及标签之间的所有空白。

当收到第一次关闭</text>和第二次打开之间的空白时<text>,变量currentElement仍然包含"testo". currentName因此,即使解析器位于您感兴趣的标签之外,您也可以附加空格(换行符) 。

为了修复它,您需要更好地处理currentElement(例如将其设置为nil每个结束标记之后),或者您需要另外检查堆栈深度。

于 2012-04-19T10:56:01.673 回答