代码之家  ›  专栏  ›  技术社区  ›  Ross Rogers

请求完整的、可编译的libxml2 sax示例

  •  3
  • Ross Rogers  · 技术社区  · 14 年前

    我花了很多时间来研究如何使用libxml2的sax解析器。有人能发布一个解析这个XML的例子吗(是的,没有 <xml...>

    <hello foo="bar">world</hello>
    

    解析器应该打印出元素中包含的数据 hello foo .

    我正在做这个例子,但希望有人能打败我,因为我没有太大的进步。Google还没有为libxml2 sax解析器生成任何完整的工作示例。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Ross Rogers    9 年前

    改编自 http://julp.developpez.com/c/libxml2/?page=sax

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <libxml/tree.h>
    #include <libxml/parser.h>
    #include <libxml/parserInternals.h>
    
    
    void start_element_callback(void *user_data, const xmlChar *name, const xmlChar **attrs) {
      printf("Beginning of element : %s \n", name);
      while (NULL != attrs && NULL != attrs[0]) {
        printf("attribute: %s=%s\n",attrs[0],attrs[1]);
        attrs = &attrs[2];
      }
    }
    
    int main() {
      const char* xml_path = "hello_world.xml";
      FILE *xml_fh = fopen(xml_path,"w+");
      fputs("<hello foo=\"bar\" baz=\"baa\">world</hello>",xml_fh);
      fclose(xml_fh);
    
    
      // Initialize all fields to zero
      xmlSAXHandler sh = { 0 };
    
      // register callback
      sh.startElement = start_element_callback;
    
      xmlParserCtxtPtr ctxt;
    
      // create the context
      if ((ctxt = xmlCreateFileParserCtxt(xml_path)) == NULL) {
        fprintf(stderr, "Erreur lors de la création du contexte\n");
        return EXIT_FAILURE;
      }
      // register sax handler with the context
      ctxt->sax = &sh;
    
      // parse the doc
      xmlParseDocument(ctxt);
      // well-formed document?
      if (ctxt->wellFormed) {
        printf("XML Document is well formed\n");
      } else {
        fprintf(stderr, "XML Document isn't well formed\n");
        //xmlFreeParserCtxt(ctxt);
        return EXIT_FAILURE;
      }
    
      // free the memory
      // xmlFreeParserCtxt(ctxt);
    
    
      return EXIT_SUCCESS;
    }
    

    这将产生输出:

    Beginning of element : hello 
    attribute: foo=bar
    attribute: baz=baa
    XML Document is well formed
    

    g++ -I/usr/include/libxml2 libxml2_hello_world.cpp /usr/lib/libxml2.a -lz\
        -o libxml2_hello_world
    
        2
  •  0
  •   Jay    14 年前

    我能建议一下吗 rapidxml