KissXML で HTML を無理矢理使う方法

KissXML で HTML を扱えるように、KissXML+HTML を作りました
そんなに KissXML に思い入れがあるわけではないのですが、HTML でも XPath を使いたいのと、XPathQuery と KissXML を一つのアプリで併用するのも嫌だったので、少しだけ KissXML の Source を追って HTML を使えるよう修正してみました。

ちなみに、この修正を行なうと XML が扱えなくなります。SimpleHttpClient の HTML フィルタを作成する際には、両方扱えるような修正を入れようかと思っています。その後に patch を作成する予定です。(patch を開発元に送るか検討中)

DDXMLDocument.h の頭で HTMLparser.h を import します。

#import <libxml/HTMLparser.h>

DDXMLDocument.m

- (id)initWithData:(NSData *)data options:(unsigned int)mask error:(NSError **)error
{
    //..snip..
    xmlDocPtr doc = xmlParseMemory([data bytes], [data length]);
    //..snip..
}

xmlParseMemory ではなく、htmlReadMemory を使用するように修正します。

xmlDocPtr doc = htmlReadMemory([data bytes], [data length], "", NULL, HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);

DDXMLNode.m

+ (BOOL)isXmlDocPtr:(xmlKindPtr)kindPtr
{
    return kindPtr->type == XML_DOCUMENT_NODE;
}

type が XML_HTML_DOCUMENT_NODE の時も真を返すようにします。

    return kindPtr->type == XML_DOCUMENT_NODE
        || kindPtr->type == XML_HTML_DOCUMENT_NODE;

たったこれだけで、KissXML が HTML を扱えるようになります。
ちなみに手元では、wedata にある LDRFullFeed を使って本文を抽出する事ができました。