我正在尝试使用 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 改变不可变对象(immutable对象):”即使 currentNodeContent 的类型为 NSMutableString
最佳答案
没有详细查看您的代码,但您应该知道 SAX 解析器不保证所有连续代码都将作为单个 characters() 调用传递。实体引用,如您的
,是一个典型的案例,其中许多/大多数解析器将在它们之前传递文本作为一个 characters() 调用,实体的扩展作为另一个,然后文本作为第三个。
您的应用程序有责任从连续的 characters() 调用中累积数据,直到出现非 characters() 事件。
(这与 SAX 事件传递的效率和解析器缓冲区管理等有关,但除非您正在编写解析器,否则您只需要知道前面的句子即可。)
任何好的 SAX 教程都应该说明执行此操作的方法。
(DOM 可能会出现类似的问题,如果解析器被告知要保留实体边界,或者如果文档在第一次被解析后已经被编辑过。应用程序应该准备好连续找到几个文本节点作为兄弟节点,除非众所周知,DOM 是标准化形式。)
关于ios - 由于内容中的换行导致 xml 解析不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20562606/