Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > xml парсер под Linux


Автор: admsasha 7.1.2007, 10:17
На форуме примеры парсинга только под windows и библиотекой .DLL, что для Linux не применимо...

Пожалуйста, киньте код простейшего xml парсинга ?  smile 

Автор: MAKCim 7.1.2007, 10:53
ну в Python должна быть, в Perl
да и на С libxml

Автор: GrayCardinal 7.1.2007, 13:07
Код

/*
 * (c) Oleg Puchinin 2006
 * graycardinalster@gmail.com
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

static void
print_element_names(xmlNode * a_node, int n)
{
    int i;
    xmlNode *cur_node = NULL;
    
    for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
        for (i = 0; i < n; ++i) 
            fputc ('\t', stdout);

        if (cur_node->type == XML_ELEMENT_NODE)
            printf("%s", cur_node->name);
        if (cur_node->type == XML_TEXT_NODE)
            printf ("%s", cur_node->content);
        printf ("\n");        
        print_element_names(cur_node->children, n+1);
    }
}

int main (int argc, char ** argv)
{
    xmlDocPtr doc;
    xmlNodePtr tree, subtree, root_element;

    root_element = NULL;

    doc = xmlNewDoc((const xmlChar*) "1.0");
    doc->children = xmlNewDocNode(doc, NULL, (const xmlChar*) "EXAMPLE", NULL);
    xmlSetProp(doc->children, (const xmlChar*) "prop1", (const xmlChar*) "gnome is great");
    xmlSetProp(doc->children, (const xmlChar*) "prop2", (const xmlChar*) "& linux too");
    
    tree = xmlNewChild(doc->children, NULL, (const xmlChar*) "head", NULL);
    subtree = xmlNewChild(tree, NULL, (const xmlChar*) "title", (const xmlChar*) "Welcome to Gnome");
    tree = xmlNewChild(doc->children, NULL, (const xmlChar*) "chapter", NULL);
    subtree = xmlNewChild(tree, NULL, (const xmlChar*) "title", (const xmlChar*) "The Linux adventure");
    subtree = xmlNewChild(tree, NULL, (const xmlChar*) "p", (const xmlChar*) "bla bla bla ...");
    subtree = xmlNewChild(tree, NULL, (const xmlChar*) "image", NULL);
    
    xmlSetProp(subtree, (const xmlChar*) "href", (const xmlChar*) "linus.gif");
    xmlSaveFile("my.xml", doc);
    xmlFreeDoc(doc);
    
    doc = xmlReadFile("my.xml", NULL, 0);
    
    if (doc == NULL) {
        printf("error: could not parse file %s\n", "my.xml");
        return EXIT_FAILURE;
    }
    
    root_element = xmlDocGetRootElement(doc);
    print_element_names(root_element, 0);
    
    xmlFreeDoc(doc);
    xmlCleanupParser();

    return EXIT_SUCCESS;
}

Создаст xml файло, сохранит, загрузит и распарсит. помнится надо -lxml  и все  smile 
Да, я код только модифицировал под свои нужды. Вообще в libxml2 сэмпл очень хороший.

Автор: admsasha 7.1.2007, 13:15
Спасибо.

Автор: GrayCardinal 7.1.2007, 16:44
admsasha, 
 smile 

Автор: bsa 12.1.2007, 00:22
А есть еще очень классный парсер TinyXML. Это C++. Свободная лицензия (т.е. можно включать в проприетарный код). Очень удобно работать.

Автор: GrayCardinal 12.1.2007, 04:44
bsa, 
Как у нее насчет действительно больших файло ? Доступ по ключикам не тормозит ? smile 

Автор: bsa 20.1.2007, 21:06
GrayCardinal, а х.з., если честно. Не пробовал smile

Автор: chaos 14.2.2007, 13:29
есть еще xerces, кроссовый вроде как

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)