Почему объекты в libxml2 SAX-parsed значения атрибутов закодированы?

Я извлекаю значение объекта XML в синтаксическом анализаторе libxml2 SAX аналогично тому, как ответ на этот вопрос предполагает. В частности, мой код выглядит так (attributes[i].value есть *xmlChar):

    int valueLength = (int) (attributes[i].end - attributes[i].value);
    value = [[[NSString alloc] initWithBytes:attributes[i].value
                                      length:valueLength
                                    encoding:NSUTF8StringEncoding
    ] autorelease];

Однако по какой-то причине, когда значение атрибута (в данном случае URL-адрес) имеет сущность & в исходном XML, значение, которое я получаю, имеет &#38.

Чего-чего?

Как мне заставить libxml2 декодировать объекты атрибутов (похоже, это нормально для объектов текстовых узлов), чтобы я просто получил &?


person theory    schedule 16.02.2011    source источник


Ответы (1)


libxml2 не заменяет объекты по умолчанию, вы должны включить это при создании xmlReader.

Этот код имеет пример

http://xmlsoft.org/examples/reader2.c

Документы для XML_PARSE_NOENT находятся здесь;

http://xmlsoft.org/html/libxml-parser.html

Хотя я уже давно не использовал биты сущностей из libxml2, я помню, что мне нужно было что-то сделать, чтобы установить преобразователь сущностей по умолчанию. Документы по этому поводу здесь;

http://xmlsoft.org/xmlio.html

Если это не завершит это, пожалуйста, отправьте мне ответный запрос, и я посмотрю исходный код для Foto Brisko, я должен был справиться с этим там ...

Хотя сообщение в блоге длинное, я думаю, что образец отсюда

http://bill.dudney.net/roller/objc/entry/libxml2_push_parsing

может быть, также были включены вещи с сущностью, но это было так давно, что я забыл, и у меня сейчас нет времени, чтобы вернуться к этому.

Удачи!

person Bill Dudney    schedule 16.02.2011
comment
Да, ваша запись в блоге libxml2 была отправной точкой для моего кода. В нем нет ничего, связанного с сущностями, AFAICT. И нет аргумента options для xmlCreatePushParserCtxt(), как и для xmlReaderForFile(). Но, может быть, мне просто нужен указатель на функцию в правильном слоте в структуре simpleSAXHandlerStruct? Я изучаю это сейчас… - person theory; 16.02.2011
comment
А, нашел. После строки, создающей контекст, xmlContext = xmlCreatePushParserCtxt(&simpleSAXHandlerStruct, self, NULL, 0, NULL);, я помещаю еще одну строку для установки параметров, xmlCtxtUseOptions(xmlContext, XML_PARSE_NODICT | XML_PARSE_NOENT);. Это делает свое дело. Спасибо! - person theory; 16.02.2011
comment
Теперь просто используя XML_PARSE_NOENT. Понятия не имею, для чего XML_PARSE_NODICT. Эта однострочная документация мало что для меня значит. XML_PARSE_NOENT это все, что мне было нужно. Любопытно, почему сущности декодируются в текстовых узлах, но мне нужен этот параметр, чтобы заставить их декодировать в значениях атрибутов. То есть, почему должно быть иначе? В любом случае, еще раз спасибо. - person theory; 16.02.2011