我正在尝试从Xcode中的URL解析XML。我遇到的麻烦是节点内有新的行字符。当我解析以下XML时,我得到的地址完全正常,但不是名称或描述。此外,如果碰巧有“&”符号,解析器停止解析。我如何解决这两个障碍?
以下是我尝试解析的示例XML:
<item>
<Name>
John Smith
</Name>
<Address>555 WHITEHEAD ST, Greenville, NY 55555</Address>
<Description>
Brick house - white trim
</Description>
</item>
<item>
<Name>
Jane Smith
</Name>
<Address>555 WHITEHEAD ST, Greenville, NY 55555</Address>
<Description>
Brick house - white trim & stone drive
</Description>
</item>
以下是我用来解析XML的代码:
-(id) loadXMLByURL:(NSString *)urlString {
arrests = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;
}
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"item"]) {
currentArrest = [[ArrestObject alloc] init];
}
}
-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"channel"]) {
return;
}
if ([elementName isEqualToString:@"item"]) {
[self.arrests addObject:currentArrest];
currentArrest = nil;
}
else {
[currentArrest setValue:currentNodeContent forKey:elementName];
currentNodeContent = nil;
}
}
非常感谢任何建议!
答案 0 :(得分:3)
foundCharacters:
。您需要将每个字符串附加到currentNodeContent
变量,而不仅仅是设置它。所以基本上,重置currentNodeContent
方法中的didStartElement
并使用didEndElement
方法中的完全附加值。
并且您不能使用stringByTrimmingCharactersInSet
来删除换行符,因为它只会删除字符串末尾的空格,而不是中间位置。
最后,&
字符的问题很简单 - 它不是XML中的有效字符。每当您需要XML中的实际&
字符时,您需要使用&
,就像在HTML中一样。 <
和>
也相同 - 分别使用<
和>
。
更新
在didStartElement
执行:
currentNodeContent = [NSMutableString string];
在foundCharacters
执行:
[currentModeContent appendString:string];