我正在使用xslt框架为iOS项目将xml转换为html。我正在将编码的xml发送到xslt框架。但是它给出的输出并没有被编码。因此,当我试图解析html时,我得到了解析器错误。
NSString *xml = @"<div>a<b</div>" // not exact this but its similar in encoding
NSData *xmlMem = [xml dataUsingEncoding:NSUTF8StringEncoding];
NSString* styleSheetPath = [[NSBundle mainBundle] pathForResource:fileName ofType:fileExtension];
xmlDocPtr doc, res;
xsltStylesheetPtr sty;
xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = 1;
sty = xsltParseStylesheetFile((const xmlChar *)[styleSheetPath cStringUsingEncoding: NSUTF8StringEncoding]);
doc = xmlParseMemory([xmlMem bytes], [xmlMem length]);
res = xsltApplyStylesheet(sty, doc, nil);
xmlChar* xmlResultBuffer = nil;
xsltSaveResultToString(&xmlResultBuffer, &length, res, sty);
NSString* resultHTML = [NSString stringWithCString: (char *)xmlResultBuffer encoding:NSUTF8StringEncoding];
NSLog(@"Result: %@", resultHTML);
结果:<div>a<b<div>
结果不是编码的html。有人能帮我解决这个问题吗?
问题如下:在解析XML字符串的过程中,任何实体引用都会被扩展,即用它们引用的字符串值替换。
如果输入的XML包含诸如<
之类的实体,则在解析它们之后,即在处理XML之前,它们将显示为<
。
为了避免这种情况,只需将&
也替换为其实体,即&
。更改
NSString *xml = @"<div>a<b</div>"
至
NSString *xml = @"<div>a&lt;b</div>"
然后,&lt;
被解析为<
,但由于它不是迭代过程,因此不应用进一步的替换。