代码之家  ›  专栏  ›  技术社区  ›  Julien Genestoux

libxml2 sax解析和与号

  •  4
  • Julien Genestoux  · 技术社区  · 15 年前

    我在使用SAX解析器时遇到了(我认为是)一种奇怪的行为,我想知道它是否正常。

    我通过SAX解析器发送这个XML:

    <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 list …我不是这封邮件的最初作者,但我注意到使用 Nokogiri Aaron (Nokogiri的维护者)实际上自己发布了这个消息。

    1 回复  |  直到 11 年前
        1
  •  5
  •   Don    15 年前

    这个 message 描述了相同的问题(我也遇到过)和 the response

    要求解析器替换实体值

    这意味着当您设置上下文时,请按如下方式设置选项:

    xmlParserCtxtPtr context = xmlCreatePushParserCtxt(&yourSAXHandlerStruct, self, NULL, 0, NULL);
    xmlCtxtUseOptions(context, XML_PARSE_NOENT);