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 项目中看到的一些与实体相关的问题。许多天浪费在这个单一的错误/糟糕的文档上:(。叹息。

于 2013-01-03T21:05:48.173 回答