无法使用 libxml2 解析太深的节点

Can’t parse too deep node by using libxml2

提问人:a_adler 提问时间:8/30/2023 更新时间:9/3/2023 访问量:41

问:

我生成了一个 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);

我尝试了许多不同的标签,但方式是一样的。也许节点级别太深了?

iOS版 Objective-C libxml2

评论


答:

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,然后控制台输出错误。