Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C-NSXML阅读我赢得的新行';T_Objective C_Ios_Xml_Nsxmlparser - Fatal编程技术网

Objective-C-NSXML阅读我赢得的新行';T

Objective-C-NSXML阅读我赢得的新行';T,objective-c,ios,xml,nsxmlparser,Objective C,Ios,Xml,Nsxmlparser,我的问题很简单。我正在解析一个XML,解析过程在使用NSXML时非常顺利。我把所有的声音放在一些数组中,现在我正在用它组成一个字符串。我的问题是,如果我以这种方式编写XML <main> <introductions> <text>Text 01</text> <text>Text 02</text> </introductions> </main> 我试图找出这条新线是从

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

<main>
  <introductions>
    <text>Text 01</text> 
    <text>Text 02</text>
  </introductions>
</main>
我试图找出这条新线是从哪里来的,所以我尝试了一些东西,发现这个XML

<main>
  <introductions>
    <text>Text 01</text> <text>Text 02</text>
  </introductions>
</main>
为什么会这样?为什么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):



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

当接收到第一次关闭
和第二次打开
之间的空格时,变量
currentElement
仍然包含
“testo”
。因此,即使解析器在您感兴趣的标记之外,也要将空格(换行符)附加到
currentName


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

委托方法
解析器:foundCharacters:
将传递所有字符数据,例如,您要查找的数据以及标记之间的所有空白

当接收到第一次关闭
和第二次打开
之间的空格时,变量
currentElement
仍然包含
“testo”
。因此,即使解析器在您感兴趣的标记之外,也要将空格(换行符)附加到
currentName


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

显示一些代码。如何添加文本值以及如何阅读them@Lefteris:这很难,因为它有很多代码,而XML只是针对我的问题专门制作的一个示例。我必须再次更改所有代码以适应它。我可以向您保证解析是正确的。我只是使用“stringAppendByString”附加字符串,行为会随着XML的更改而更改,而我预期不会。这就是问题所在。。。顺便说一句,我将尝试添加一些可能对您有所帮助的代码。阿尔贝托您可以猜到,没有这些代码,我们更难帮助您。只需向我们展示代码片段,而不是整个代码code@Lefteris事实上,正如我所说,我添加了一些片段。如果你需要更多,告诉我。提前感谢。似乎我用“stringByTrimmingCharactersInSet”修复了它,但我仍然有兴趣了解这种行为。给我们看一些代码。如何添加文本值以及如何阅读them@Lefteris:这很难,因为它有很多代码,而XML只是针对我的问题专门制作的一个示例。我必须再次更改所有代码以适应它。我可以向您保证解析是正确的。我只是使用“stringAppendByString”附加字符串,行为会随着XML的更改而更改,而我预期不会。这就是问题所在。。。顺便说一句,我将尝试添加一些可能对您有所帮助的代码。阿尔贝托您可以猜到,没有这些代码,我们更难帮助您。只需向我们展示代码片段,而不是整个代码code@Lefteris事实上,正如我所说,我添加了一些片段。如果你需要更多,告诉我。提前谢谢。似乎我用“stringByTrimmingCharactersInSet”修复了它,但我仍然有兴趣了解这种行为。谢谢。只是另一个问题,所以。。。如何在每个结束标记后将“currentElement”设置为“nil”?@AlbertoSchiariti:简单地说就是
currentElement=nil
语法分析器:didEndElement:中的某个地方。谢谢。只是另一个问题,所以。。。如何在每个结束标记后将“currentElement”设置为“nil”?@AlbertoSchiariti:简单地说就是
currentElement=nil位于
解析器:didEndElement:
的某个位置。
Text 01 Text 02
 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];
- (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];
    } 
}