提问人:a_adler 提问时间:8/30/2023 更新时间:9/3/2023 访问量:41
无法使用 libxml2 解析太深的节点
Can’t parse too deep node by using libxml2
问:
我生成了一个 img 标签的 html,由 255 个 div 标签包裹。我使用 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);
我尝试了许多不同的标签,但方式是一样的。也许节点级别太深了?
答:
1赞
nwellnhof
9/3/2023
#1
默认情况下,文档树的最大深度确实限制为 256。您应该会收到如下错误消息:
Excessive depth in document: 256 use XML_PARSE_HUGE option
正如消息所解释的,您可以使用解析器选项来绕过此限制。XML_PARSE_HUGE
评论
0赞
a_adler
9/4/2023
谢谢你,你是对的!我删除了HTML_PARSE_NOERROR,然后控制台输出错误。
评论