【发布时间】: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 */
};
charactersFoundSAX 和 errorEncounteredSAX 函数会被调用,但 startElementSAXP 和 endElementSAXP 函数永远不会被调用。
如果我将解析从 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