由于内容中的换行符导致的xml解析不准确

时间:2013-12-13 09:02:25

标签: ios iphone objective-c xml nsxmlparser

我正在尝试使用NSXMLParser解析XML,但由于我所拥有的某些xml包含换行符(),因此我得到的解析不准确。例如,“一个真正的领导者不是一个共识的搜索者,但是,一个共识的模塑者”被解析为“一个共识的模塑者”不仅是标签搞砸了而且还有逗号之后但似乎搞砸了,因为直接在没有空格的br标签旁边猜测它。任何人都有如何解决这个问题的经验?很多人都认为Stackoverflow似乎有同样的问题,但我还没能找到适合iOS的解决方案。

在xml中,br标签的打印方式如下:

<br>

这是我正在解析的xml

<entry>
<title>Quote</title>
<content>A genuine leader is not a&lt;br&gt;
searcher for consensus&lt;br&gt;
but, a molder of consensus</content>
</entry>

这是我的xml解析代码

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{   
    if ([elementname isEqualToString:@"entry"])
    {
        currentQuote = [[SQuote alloc] init];
    }

}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

    if ([elementname isEqualToString:@"content"]){
        currentQuote.content = currentNodeContent;
    }

    if ([elementname isEqualToString:@"entry"])
    {
        [self.popularEntries addObject:currentQuote];
        currentQuote = nil;
        currentNodeContent = nil;
    }
}

修改

我尝试将我的charactersFound代码更改为以下内容:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{


    if (currentNodeContent == nil)
        currentNodeContent = [[NSMutableString alloc] initWithCapacity: 20];

    [currentNodeContent appendString: [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

}

但我仍然收到一条错误,上面写着“尝试用appendString改变不可变对象:”,即使currentNodeContent的类型为NSMutableString

1 个答案:

答案 0 :(得分:-1)

没有仔细查看您的代码,但您应该知道SAX解析器不会保证所有连续代码都将作为单个characters()调用传递。像&lt; br&gt;这样的实体引用是一个经典案例,其中许多/大多数解析器将在它们之前将文本作为一个字符()调用,实体的扩展作为另一个,以及作为第三个的文本跟随它们。

您的应用程序有责任从连续的字符()调用中累积数据,直到非字符()事件进入。

(这有理由与SAX事件传递和解析器缓冲区管理的效率等有关,但除非您正在编写解析器,否则您需要知道的是前一句话。)

任何好的SAX教程都应说明如何做到这一点。

(如果解析器被告知保留实体边界或者文档自首次被解析后已被编辑,则DOM会出现类似问题。应用程序应准备好连续找到几个Text节点作为兄弟节点,除非已知DOM处于标准化形式。)