我生成了一个由 255 个 div 标签包裹的 img 标签的 html。我使用libxml解析html并输出结果,但结果中缺少img标签。但如果div标签的个数为254,则输出结果是正确的,img标签显示在其中。为什么会发生以及如何解决?节点层级是否太深?代码如下:
NSString* html = @"<img src='https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'>";
for (int i = 0; i < 255; i++) {
html = [NSString stringWithFormat:@"<div>%@</div>", html];
}
NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];
xmlDocPtr _doc = htmlReadMemory([_data bytes], (int)[_data length], "", NULL, HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);
if (_doc == NULL) {
NSLog(@"Unable to parse.");
return;
}
xmlXPathContextPtr _context = xmlXPathNewContext(_doc);
if(_context == NULL) {
NSLog(@"Unable to create XPath context.");
return;
}
xmlNodePtr rootNode = xmlDocGetRootElement(_doc);
xmlBufferPtr buffer = xmlBufferCreate();
if (rootNode == NULL || rootNode == nil || buffer == NULL || buffer == nil) {
return;
}
xmlNodeDump(buffer, rootNode->doc, rootNode, 0, 0);
NSString *htmlContent = [NSString stringWithCString:(const char *)buffer->content encoding:NSUTF8StringEncoding];
xmlBufferFree(buffer);
xmlXPathFreeContext(_context);
xmlFreeDoc(_doc);
NSLog(@“%@”, htmlContent);
我尝试了很多不同的标签,但都是一样的。也许节点层次太深了?
默认情况下,文档树的最大深度确实限制为 256。您应该收到如下错误消息:
Excessive depth in document: 256 use XML_PARSE_HUGE option
正如消息所解释的,您可以使用
XML_PARSE_HUGE
解析器选项来绕过此限制。