以前寫的顷锰,不知道怎么就不見了叫胁,重發(fā)
Ono是iOS & OS X平臺一個優(yōu)秀的XML、HTML解析庫菱属,內部其實是對libxml2
的封裝钳榨。最近在使用的時候遇到了一個bug缺陷。
業(yè)務代碼如下:
ONOXMLDocument *document = [ONOXMLDocument HTMLDocumentWithString:htmlString encoding:NSUTF8StringEncoding error:nil];
ONOXMLElement *element = [document firstChildWithXPath:@"/html/body/div"];
NSString *htmlContent = element.description;
這段代碼的目的是提取html中的第一個div元素纽门,通過XPath找到元素后調用description方法獲得元素的html字符串薛耻。然而,解析之后發(fā)現(xiàn)<tag></tag>
這樣的空內容標簽變成了<tag />
赏陵。這種變化對XML來說沒什么影響饼齿,但是對HTML影響很大,舉個例子:
<h1></h1><p>hello world</p>
代碼效果差不多是這樣的
調用
description
之后的html
<h1/><p>hello world</p>
效果差不多是這樣的
后面的<p>
標簽被加上<h1>
的效果瘟滨。
問題就出在description
方法上候醒,它的實現(xiàn)是這樣的
- (NSString *)description {
xmlBufferPtr buffer = xmlBufferCreate();
xmlNodeDump(buffer, self.xmlNode->doc, self.xmlNode, 0, false);
NSString *rawXMLString = @((const char *)xmlBufferContent(buffer));
xmlBufferFree(buffer);
return rawXMLString;
}
xmlNodeDump
得到的是去除空標簽的buff。經過一番搜索杂瘸,網(wǎng)上提到要使用xmlsave
模塊,保存的時候options加上XML_SAVE_NO_EMPTY
伙菊。修改之后的代碼败玉;
- (NSString *)description {
xmlBufferPtr buffer = xmlBufferCreate();
xmlSaveCtxtPtr saveCtxtPtr = xmlSaveToBuffer(buffer,NULL, XML_SAVE_NO_EMPTY);
long result = xmlSaveTree(saveCtxtPtr, self.xmlNode);
xmlSaveClose(saveCtxtPtr);
NSString *rawXMLString = result < 0 ? nil : @((const char *)xmlBufferContent(buffer));
xmlBufferFree(buffer);
return rawXMLString;
}
一個挺簡單的問題解決,希望能幫到遇到同樣問題的人镜硕。