1

iOSのlibxmlは、この一見有効なXMLファイル(SVG仕様の一部です!)の解析を断固として拒否します。

http://www.w3.org/TR/SVG11/images/coords/PreserveAspectRatio.svg

それは文句を言う:

Error Domain=1 Code=27 "Entity 'Smile' not defined
UserInfo=0x7655730
{
   lineNumber=26,
   NSLocalizedDescription=Entity 'Smile' not defined,
   bonusInfo1=Smile,
   columnNumber=25
}

...そして各エンティティの警告レベルのエラーを返します。ドキュメントが示唆していることを強制する方法はないようです(デフォルトではエンティティを解析します)。ここ(http://www.xmlsoft.org/entities.html)には、非常に困難で誰も自分でやるべきではないという不思議な疑似説明があります...しかし、libxmlもそうは思われません:( 。

エンティティ解析にオーバーライドを提供していないことを確認するためのセットアップ構造体は次のとおりです。

static xmlSAXHandler SAXHandler = {
    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 */
    cDataFoundSAX,              /* cdataBlock */
    NULL,                       /* externalSubset */
    XML_SAX2_MAGIC,
    NULL,
    startElementSAX,            /* startElementNs */
    endElementSAX,              /* endElementNs */
    structuredError,                       /* serror */
};
4

1 に答える 1

1

これは libxml の巨大なバグであり、以前からあるようです。

ドキュメント (http://www.xmlsoft.org/html/libxml-parser.html#xmlCreatePushParserCtxt) には次のように書かれています。

xmlParserCtxtPtr    xmlCreatePushParserCtxt (xmlSAXHandlerPtr sax, 
                         void * user_data, 
                         const char * chunk, 
                         int size, 
                         const char * filename)
sax:    a SAX handler
user_data:  The user data returned on SAX callbacks

しかし、彼らが言うべきことは次のとおりです。

sax:    a SAX handler
user_data:  YOU MUST NOT USE THIS BECAUSE LIBXML IS BADLY
 BROKEN INTERNALLY. NEVER PASS ANYTHING EXCEPT NULL TO
 THIS PARAMETER. ENTITIES WILL NEVER WORK IF YOU PASS
 ANYTHING EXCEPT NULL.

つまり、「userdata」ポインターを使用することはできず、代わりに独自の静的変数 (どこか) をコーディングし、それらを使用して状態を追跡する必要があります。libxml では状態自体を追跡できないためです。

(最終的に、誰かがこれが壊れている理由を尋ね、ドキュメントを警告付きで更新するように要求しているメーリング リストで参照を見つけました)

ちなみに、これは、libxml を使用した他の iOS プロジェクトで私が見たエンティティ関連の問題を説明していると思います。この 1 つのバグ / 不適切なドキュメントに何日も無駄になりました :(. ため息。

于 2013-01-03T21:05:48.173 に答える