为啥这不能正确解析?
Posted
技术标签:
【中文标题】为啥这不能正确解析?【英文标题】:Why does this not parse correctly?为什么这不能正确解析? 【发布时间】:2013-08-12 03:43:30 【问题描述】:好吧,基本上,我正在尝试解析一个子元素:
<element>
<sub element 1>
<sub element 2>
<sub element 3>
<element>
我要解析的当前原始文档包含如下示例:
子元素内容1:AB, CD, DE, & SOMETHING DISPLAYED
.
我只抢到了& SOMETHING DISPLAYED
。我无法解析整个子元素。
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
currentNodeContent = (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//NSLog(@"CURRENT CONTENT: %@", currentNodeContent);
这是第一个问题。我遇到的第二个问题是上面提到的应该有 11 个项目。但它只设法抓住了 2 件物品。请注意,每个项目都包含子元素,除了一些子元素是null
Issues has been added: (null)-(null)-(null)
Issues has been added: sub-element-1 sub-element2 sub-element3
下面是didEndElement
的一部分:
if ([elementName isEqualToString:@"Issue"])
//add currentIssue object into issues array
[issues addObject:currentIssue];
NSLog(@"Issues has been added: %@-%@-%@", currentIssue.sub-element-1, currentIssue.sub-element-2, currentIssue.sub-element-3);
currentIssue = nil;
currentNodeContent = nil;
if ([elementName isEqualToString:@"sub element 1"])
currentIssue.sub-element-1 = currentNodeContent;
NSLog(@"sub element 1: %@", currentIssue.sub-element-1);
if ([elementName isEqualToString:@"sub element 2"])
currentIssue.sub-element-2 = currentNodeContent;
NSLog(@"sub element 2: %@", currentIssue.sub-element-2);
if ([elementName isEqualToString:@"sub element 3"])
currentIssue.sub-element-3 = currentNodeContent;
NSLog(@"sub element 3: %@", currentIssue.sub-element-3);
非常感谢您的意见和/或建议。
更新 1: 好的,我已经解决了这个问题。
似乎“currentIssue = nil”会导致对象丢失其内容,因为我能够打印出 currentNodeContent。
因此,通过删除 currentIssue,我现在能够看到我需要的所有假定元素。
但是还有一个问题。我现在可以看到所有子元素,但只剩下一个子元素被部分抓取,我不明白为什么。
【问题讨论】:
为什么在变量中包含连字符(例如sub-element-1
)?也为您的elementName
、sub-element-i-want-3 != sub element 3
请原谅我。我很着急。请编辑。
你为什么不自己NSLog
elementName?
因为我可以看到elementNames,我只是不明白为什么它不能抓取值。 :) 无论如何,我已经解决了这个问题。 :)
【参考方案1】:
对于 <sub element 1>
,sub element 1
不是 elementName
。元素名称为sub
。
【讨论】:
【参考方案2】:- (XMLParserViewController *) initXMLParser
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
return self;
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
if([elementName isEqualToString:@"Books"])
appDelegate.books = [[NSMutableArray alloc] init];
else if([elementName isEqualToString:@"Book"])
aBook = [[Books alloc] init];
NSLog(@"Processing Element: %@", elementName);
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
[currentElementValue appendString:string];
NSLog(@"Processing Value: %@", currentElementValue);
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
if([elementName isEqualToString:@"Books"])
return;
if([elementName isEqualToString:@"Book"])
[appDelegate.books addObject:aBook];
aBook = nil;
else if([elementName isEqualToString:@"name"])
aBook.name=currentElementValue;
else if([elementName isEqualToString:@"address"])
aBook.address=currentElementValue;
else if([elementName isEqualToString:@"country"])
aBook.country=currentElementValue;
currentElementValue = nil;
NSLog(@"%@",aBook.name);
NSLog(@"%@",aBook.address);
NSLog(@"%@",aBook.country);
用你的元素试试这个代码希望这对你有用.... :)
【讨论】:
【参考方案3】:好的,我已经解决了这个问题。
似乎“currentIssue = nil”会导致对象丢失其内容,因为我能够打印出 currentNodeContent。
因此,通过删除 currentIssue,我现在能够看到我需要的所有假定元素。
其次,为了使其正常工作,我在“parserDidStartDocument”而不是“parserDidStartElement”下初始化了数组。
【讨论】:
以上是关于为啥这不能正确解析?的主要内容,如果未能解决你的问题,请参考以下文章