gpt4 book ai didi

Objective-C - NSXML 读取我不会读取的新行

转载 作者:行者123 更新时间:2023-11-29 13:37:23 26 4
gpt4 key购买 nike

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

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

...然后我将 2 个字符串附加到我获得的 Storyboard上的标签中:

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];
}
}

最佳答案

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

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

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

关于Objective-C - NSXML 读取我不会读取的新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10225108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com