解析包含节点内新行字符的xml

时间:2014-01-09 21:36:12

标签: ios xml parsing xml-parsing

我正在尝试从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;
}
}

非常感谢任何建议!

1 个答案:

答案 0 :(得分:3)

每个元素可以多次调用

foundCharacters:。您需要将每个字符串附加到currentNodeContent变量,而不仅仅是设置它。所以基本上,重置currentNodeContent方法中的didStartElement并使用didEndElement方法中的完全附加值。

并且您不能使用stringByTrimmingCharactersInSet来删除换行符,因为它只会删除字符串末尾的空格,而不是中间位置。

最后,&字符的问题很简单 - 它不是XML中的有效字符。每当您需要XML中的实际&字符时,您需要使用&amp;,就像在HTML中一样。 <>也相同 - 分别使用&lt;&gt;

更新

didStartElement执行:

currentNodeContent = [NSMutableString string];

foundCharacters执行:

[currentModeContent appendString:string];