【问题标题】:libxml2 HTML parsing problemslibxml2 HTML解析问题
【发布时间】:2010-08-15 13:21:23
【问题描述】:

我正在使用 libxml2 来解析 HTML:

static htmlSAXHandler simpleSAXHandlerStruct = {
    NULL,                       /* internalSubset */
    NULL,                       /* isStandalone   */
    NULL,                       /* hasInternalSubset */
    NULL,                       /* hasExternalSubset */
    NULL,                       /* resolveEntity */
    NULL,                       /* getEntity */
    NULL,                       /* entityDecl */
    NULL,                       /* notationDecl */
    NULL,                       /* attributeDecl */
    NULL,                       /* elementDecl */
    NULL,                       /* unparsedEntityDecl */
    NULL,                       /* setDocumentLocator */
    NULL,                       /* startDocument */
    NULL,                       /* endDocument */
    NULL,                       /* startElement*/
    NULL,                       /* endElement */
    NULL,                       /* reference */
    charactersFoundSAX,         /* characters */
    NULL,                       /* ignorableWhitespace */
    NULL,                       /* processingInstruction */
    NULL,                       /* comment */
    NULL,                       /* warning */
    errorEncounteredSAX,        /* error */
    NULL,                       /* fatalError //: unused error() get all the errors */
    NULL,                       /* getParameterEntity */
    NULL,                       /* cdataBlock */
    NULL,                       /* externalSubset */
    XML_SAX2_MAGIC,             //
    NULL,
    startElementSAXP,           /* startElementNs */
    endElementSAXP,             /* endElementNs */
    NULL,                       /* serror */
};

charactersFoundSAXerrorEncounteredSAX 函数会被调用,但 startElementSAXPendElementSAXP 函数永远不会被调用。

如果我将解析从 HTML 改为解析 XML(并将所有定义包括 'html' 更改为 'xml',例如更改为 xmlSAXHandler),函数会被正确调用。

这是为什么呢?

【问题讨论】:

  • 您的意思是:如果我将解析从 HTML 更改为解析 XML?愿意给我们 HTML/XML 文件,以便我们真正开始研究它吗?我只能说我的 HTML SAX 解析器工作正常。
  • 你可以试试http://www.google.com/index.html。你确定这两个函数在你的解析器中被调用:xmlsoft.org/html/libxml-parser.html#startElementNsSAX2Funcxmlsoft.org/html/libxml-parser.html#endElementNsSAX2Func
  • 嗯,不,我不在 html 模式下使用 NS-aware 函数槽。这将是你的问题,我认为,HTML 没有名称空间的概念,也许你最好使用 startElement/endElement 插槽?
  • 是的,这些是我目前正在使用的。是否有任何简单的方法可以确定在 endElement 插槽函数中打开了相应的起始元素(例如,如果我想从其中包含嵌套 div 的 HTML 中提取 div)?
  • 嗯?这就是 sax 的美妙之处,这是您的全部责任,在最坏的情况下保留访问节点的树,您知道 sax 会深度优先遍历树,因此很容易构建该树。

标签: html c html-parsing libxml2


【解决方案1】:

HTML 不支持命名空间,因此在 SAX 解析器中仅使用 startElementNs/endElementNs 函数槽将导致您观察到的行为。

简单修复:填写startElement/endElement 插槽。

您可以轻松地使用包装器来匹配不同的签名,然后在 XML 和 HTML 模式下只调用一个底层函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多