我正在尝试使用NSXMLParser解析XML,但由于我所拥有的某些xml包含换行符(),因此我得到的解析不准确。例如,“一个真正的领导者不是一个共识的搜索者,但是,一个共识的模塑者”被解析为“一个共识的模塑者”不仅是标签搞砸了而且还有逗号之后但似乎搞砸了,因为直接在没有空格的br标签旁边猜测它。任何人都有如何解决这个问题的经验?很多人都认为Stackoverflow似乎有同样的问题,但我还没能找到适合iOS的解决方案。
在xml中,br标签的打印方式如下:
<br>
这是我正在解析的xml
<entry>
<title>Quote</title>
<content>A genuine leader is not a<br>
searcher for consensus<br>
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
答案 0 :(得分:-1)
没有仔细查看您的代码,但您应该知道SAX解析器不会保证所有连续代码都将作为单个characters()调用传递。像&lt; br&gt;这样的实体引用是一个经典案例,其中许多/大多数解析器将在它们之前将文本作为一个字符()调用,实体的扩展作为另一个,以及作为第三个的文本跟随它们。
您的应用程序有责任从连续的字符()调用中累积数据,直到非字符()事件进入。
(这有理由与SAX事件传递和解析器缓冲区管理的效率等有关,但除非您正在编写解析器,否则您需要知道的是前一句话。)
任何好的SAX教程都应说明如何做到这一点。
(如果解析器被告知保留实体边界或者文档自首次被解析后已被编辑,则DOM会出现类似问题。应用程序应准备好连续找到几个Text节点作为兄弟节点,除非已知DOM处于标准化形式。)