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