gpt4 book ai didi

html - libxml 在空格处拆分文本节点

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:54 26 4
gpt4 key购买 nike

我正在使用 libxml 的 HTML 解析器来创建 html 文档的 dom 树。 libxml 将每个节点的文本内容作为一个整体字符串(节点)给出,但我的要求是进一步拆分每个文本节点的空格并创建尽可能多的单词节点。到目前为止,我还没有从 libxml 中找到任何选项,所以我创建了一个 cpu 昂贵的逻辑来拆分文本节点。以下是有效的递归方法部分。

void parse(xmlNodePtr cur, El*& parent) {

if (!cur) {
return;
}

string tagName = (const char*) cur->name;
string content = node_text(cur); // function defined below

Element* el = new Element(tagName, content);
parent->childs.push_back(el);


size_t pos;
string text;
cur = cur->children;
while (cur != NULL) {
if (xmlNodeIsText(cur) && (pos = node_text_find(cur, text, " ")) != string::npos) {

string first = text.substr(0, pos);
string second = text.substr(pos + 1);
El *el1 = new Element("text", first);
el->childs.push_back(el1);

El *el2 = new Element("text", " ");
el->childs.push_back(el2);

xmlNodeSetContent(cur, BAD_CAST second.c_str());
continue;
}
parse(cur, el);
cur = cur->next;
}
}

string node_text(xmlNodePtr cur) {
string content;
if (xmlNodeIsText(cur)) {
xmlChar *buf = xmlNodeGetContent(cur);
content = (const char*) buf;
}
return content;
}

size_t node_text_find(xmlNodePtr cur, string& text, string what){
text = node_text(cur);
return text.find_first_of(what);
}

上述代码的问题是它不适用于某些 UTF 字符串,例如中文,而且这段代码会增加整个解析过程的时间。

任何人都可以提出更好的方法,在此先感谢您!

最佳答案

我没有完整的答案,但我确实看到您将 xmlChar 显式转换为 char。这是一个不好的迹象,可能也是它在 Unicode 上不起作用的原因。

如果您正在处理 Unicode(可能是 xmlChar),则需要使用 Unicode 文本处理库。不是 std::string。

您实际上有两个选择。查找以 UTF-8 处理的库或将 UTF-8 转换为 wchar(宽字符)。如果转换为wchar,则可以使用wstring及其函数来处理Unicode。

libxml2 xmlChar * to std::wstring看起来是个有用的答案。

至于速度,是我的眼睛欺骗了我,还是您在一个空间上 split 并创建一个新元素然后再次 split ?这不是表现的方式。我认为,如果您删除文本节点、拆分所有单词并边添加新节点,效果会更好。

减速最有可能发生在对象的重复创建、复制和销毁中。努力尽量减少这种情况。例如,如果 Element 有一个接受开始/结束迭代器对或开始、长度对的构造函数形式,这将比创建子字符串(复制!)和创建 Element(复制!)然后销毁子字符串。

使用文本字符串的后半部分(可能很大)重复调用 xmlNodeSetContent,性能为 O2。不好。

关于html - libxml 在空格处拆分文本节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20624615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com