【问题标题】:Parsing xml that contains new line characters within nodes解析在节点中包含换行符的 xml
【发布时间】:2014-01-09 21:36:11
【问题描述】:

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

非常感谢任何建议!

【问题讨论】:

    标签: ios xml parsing xml-parsing


    【解决方案1】:

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

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

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

    更新:

    didStartElement 做:

    currentNodeContent = [NSMutableString string];
    

    foundCharacters 做:

    [currentModeContent appendString:string];
    

    【讨论】:

    • 感谢您的帮助!我对 Xcode 很陌生。我应该如何将每个字符串附加到 currentNodeContent,因为它是一个 NSMutableString?在 didStartElement 中,我应该使用 currentNodeContent = nil 重置 currentNodeContent?
    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 2012-01-14
    • 1970-01-01
    • 2018-07-25
    • 2011-05-16
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多