2010-08-15 84 views
0

我使用的libxml2解析HTML: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)),函數就會正確調用。

這是爲什麼?

+1

你是什麼意思:如果我改變從HTML分析和解析XML呢?謹慎給我們HTML/XML文件,以便我們可以真正開始挖掘它?我只能說我的HTML SAX解析器可以工作。 – hroptatyr 2010-08-15 13:41:29

+0

您可以嘗試'http:// www.google.com/index.html'。您確定這兩個函數在解析器中被調用: http://xmlsoft.org/html/libxml-parser.html#startElementNsSAX2Func http://xmlsoft.org/html/libxml-parser.html#endElementNsSAX2Func – ryyst 2010-08-15 13:53:22

+0

那麼不,我不使用HTML模式下的NS感知功能插槽。 這將是你的問題,我認爲,HTML沒有命名空間的概念,也許你最好使用startElement/endElement插槽? – hroptatyr 2010-08-15 14:02:37

回答

1

HTML不是名稱空間感知,因此只使用SAX解析器中的startElementNs/endElementNs函數槽將導致您觀察到的行爲。

簡單修正:填入startElement/endElement空位。

您可以輕鬆使用包裝來匹配不同的簽名,然後在XML和HTML模式下調用一個底層函數。

+0

正如評論中所討論的那樣,這是有效的。謝謝! – ryyst 2010-08-15 14:51:28