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

问题描述 投票:0回答:1

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

我尝试了很多不同的标签,但都是一样的。也许节点层次太深了?

ios objective-c libxml2
1个回答
0
投票

默认情况下,文档树的最大深度确实限制为 256。您应该收到如下错误消息:

Excessive depth in document: 256 use XML_PARSE_HUGE option

正如消息所解释的,您可以使用

XML_PARSE_HUGE
解析器选项来绕过此限制。

© www.soinside.com 2019 - 2024. All rights reserved.