Libxml2 отказва да анализира XML обекти

libxml на iOS категорично отказва да анализира този привидно валиден 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 */
};

person Adam    schedule 03.01.2013    source източник


Отговори (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 няма да ви позволи да проследявате самото състояние.

(В крайна сметка намерих препратка в пощенски списък, където някой попита защо това не работи и поиска документите да бъдат актуализирани с предупреждение)

Между другото, това обяснява някои проблеми, свързани с обекти, които съм виждал в други проекти на iOS, които използват libxml, мисля. Много дни пропиляни за тази единствена грешка/лоша документация :(. Въздишка.

person Adam    schedule 03.01.2013