0

我是 libxml 的新手,到目前为止一切都很好,但我注意到一件让我烦恼的事情:当 libxml 报告字符时,即调用处理程序的字符函数时,“特殊”字符如 ' 或 " 或单独报告。例如:

"It's a nice day today. Don't you agree?"
report:"
report: It
report: '
report: s a nice day today. Don
report: '
report: you aggree?
report: "

有没有办法改变这种行为,所以它会被报告为一个完整的字符串?不要误会我的意思,使用 strcat 将原始字符串放在一起不是问题,但这是额外的工作;)

我搜索了标题和网络,但没有找到解决方案。先感谢您。

编辑:因为上面的处理程序描述需要更多解释。通过报告字符,我的意思是当处理程序的 (htmlSAXHandler) handler.characters 回调函数被调用时,我分配了:

void _characters(void *context, const xmlChar *ch, int len) {
    printf("report: %s\n", chars);
}
4

2 回答 2

1

如果您的文档不会太大以至于无法将其全部保存在内存中,您可能希望查看 DOM 解析而不是注册 SAX 回调。

#include <stdio.h>
#include <libxml/HTMLparser.h>
#include <libxml/tree.h>

int main()
{
  htmlDocPtr doc;
  xmlNodePtr root, node;
  char *output;
  char *rawhtml = "<html><body>\"It's a nice day today.  Don't you agree?\"</body></html>";
  doc = htmlReadDoc(rawhtml, NULL, NULL, XML_PARSE_NOBLANKS);
  root = xmlDocGetRootElement(doc);
  node = root->children;
  output = xmlNodeGetContent(node);
  printf("output=[%s]\n", output);
  if(output)
    xmlFree(output);
  if(doc)
    xmlFreeDoc(doc);
}

生产

output=["It's a nice day today.  Don't you agree?"]
于 2012-11-01T14:10:45.090 回答
0

恐怕你应该忍受它。如果您遇到一个包含 100K 字符的 HTML 文档,您是否还希望它一次性提供所有字符?我认为您应该随时准备好拆分角色。然后将它们拆分为特殊字符没有区别。

如果您的软件旨在仅读取小型 HTML 文档,则此答案是不够的,但我敢打赌 libxml 作者并没有考虑对此类情况进行特殊处理。

于 2012-11-01T08:41:10.237 回答