LibXML2 Sax Parsing и амперсанд

Я столкнулся (как мне кажется) со странным поведением при использовании парсера sax, и я хотел знать, нормально ли это.

Я отправляю этот XML через парсер SAX:

<site url="http://example.com/?a=b&amp;b=c"; />

«&» преобразуется в «&» при вызове обратного вызова startElement. Это должно быть сделано? Если да, то хотелось бы понять почему.

Я вставил пример, демонстрирующий проблему здесь:

#include <stdlib.h>
#include <libxml/parser.h>

static void start_element(void * ctx, const xmlChar *name, const xmlChar **atts)
{
  int i = 0;
  while(atts[i] != NULL) {
    printf("%s\n", atts[i]);
    i++;
  }
}

int main(int argc, char *argv[]) {
  xmlSAXHandlerPtr handler = calloc(1, sizeof(xmlSAXHandler));
  handler->startElement = start_element;

  char * xml = "<site url=\"http://example.com/?a=b&amp;b=c\" />";

  xmlSAXUserParseMemory( handler,
                          NULL,
                          xml,
                          strlen(xml)
  );
}

PS: Это сообщение на самом деле извлечено из списка LibXML2. .. и я не являюсь первоначальным автором этого письма, но я заметил проблему, используя Nokogiri и Аарон (сопровождающий Nokogiri) на самом деле сами разместили это сообщение.


person Julien Genestoux    schedule 11.06.2009    source источник


Ответы (1)


Это сообщение описывает ту же проблему (которая была и у меня ) и ответ говорит

попросить парсер заменить значения сущностей

Это означает, что когда вы настраиваете свой контекст, установите параметр следующим образом:

xmlParserCtxtPtr context = xmlCreatePushParserCtxt(&yourSAXHandlerStruct, self, NULL, 0, NULL);
xmlCtxtUseOptions(context, XML_PARSE_NOENT);
person Don    schedule 02.09.2009