0

iOSプロジェクトのxmlをhtmlに変換するためにxsltフレームワークを使用しています。エンコードされた xml を xslt フレームワークに送信しています。しかし、それが与える出力はエンコードされていません。そのため、html を解析しようとすると、パーサー エラーが発生します。

NSString *xml = @"<div>a&lt;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 ではありません。誰でもこの問題を解決するのを手伝ってもらえますか?

4

1 に答える 1

0

問題は次のとおりです。XML の文字列を解析する過程で、すべてのエンティティ参照が展開されます。つまり、エンティティ参照が参照する文字列値に置き換えられます。

入力 XML に などのエンティティが含まれている場合、それらは解析されるとすぐに、XML が処理される前に&lt;表示されます。<

これを避けるに&は、そのエンティティも置き換え&amp;ます。変化する

NSString *xml = @"<div>a&lt;b</div>"

NSString *xml = @"<div>a&amp;lt;b</div>"

その後、&amp;lt;に解決され&lt;ますが、反復プロセスではないため、それ以上の置換は適用されません。

于 2014-10-20T10:57:13.370 に答える