C/C++,libxml2:解析HTML片段

C/C++, libxml2: parsing HTML fragments

本文关键字:解析 HTML 片段 libxml2 C++      更新时间:2023-10-16

我需要解析现实生活中的HTML文档。在大多数情况下,它们都是良好的形式,但有时(这一点不容忽视),它们看起来像在根级别具有多个同级的片段
示例:

<div>one</div>
<div>two</div>

现在,我使用带有以下解析标志的libxml2 v2.7.8:

HTML_PARSE_NOERROR | HTML_PARSE_RECOVER | HTML_PARSE_NODEFDTD | HTML_PARSE_NOIMPLIED

如果我给它提供上面的例子,然后从解析的文档中转储HTML:

<div>one<div>two</div></div>

正如你所看到的,它嵌套了元素,而我的要求是不要破坏HTML。此外,我希望能够在由这些片段创建的树上运行XPath表达式。在这种情况下,要获得第二个DIV,可以使用"/DIV[2]"。

所以问题是是否有可能解析这些类型的HTML,以及如何解析?

我想您需要html到xml的转换。在Java中,我使用JSoup,但stackoverflow肯定知道如何在c中做到这一点

PHP的DOM组件使用Libxml2。使用PHP时,我发现了以下解决方法:

<?php
echo DOMDocument::loadHTML("<b>Bold</b> <i>Italic</i>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)->saveHTML();
echo DOMDocument::loadHTML("<div><b>Bold</b> <i>Italic</i>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)->saveHTML();

输出:

<b>Bold<i>Italic</i></b>
<div><b>Bold</b> <i>Italic</i></div>

因此,对于不可否认的有点棘手的答案,只需在输入字符串前加上<div>,然后从输出字符串中删除<div></div>