Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gabriel...

libxml2

Recommended Posts

Galera,

 

Achei um exemplo de como ler aquivos xml, rodou perfeitamente (no Linux), fiz a leitura de uns arquivos aqui no meu HD e tal, enfim funcionou certinho...

Vejam o codigo abaixo, bem simples ele.

 

//------------

//COPILED: gcc `xml2-config --cflags --libs` -o reader1 reader1.c

//------------

 

/**
 * section: xmlReader
 * synopsis: Parse an XML file with an xmlReader
 * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
 *          and dump the informations about the nodes found in the process.
 *          (Note that the XMLReader functions require libxml2 version later
 *          than 2.6.)
 * usage: reader1 <filename>
 * test: reader1 test2.xml > reader1.tmp ; diff reader1.tmp reader1.res ; rm reader1.tmp
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdio.h>
#include <libxml/xmlreader.h>

#ifdef LIBXML_READER_ENABLED

/**
 * processNode:
 * @reader: the xmlReader
 *
 * Dump information about the current node
 */
static void
processNode(xmlTextReaderPtr reader) {
    const xmlChar *name, *value;

    name = xmlTextReaderConstName(reader);
    if (name == NULL)
	name = BAD_CAST "--";

    value = xmlTextReaderConstValue(reader);

    printf("%d %d %s %d %d", 
	    xmlTextReaderDepth(reader),
	    xmlTextReaderNodeType(reader),
	    name,
	    xmlTextReaderIsEmptyElement(reader),
	    xmlTextReaderHasValue(reader));
    if (value == NULL)
	printf("\n");
    else {
        if (xmlStrlen(value) > 40)
            printf(" %.40s...\n", value);
        else
	    printf(" %s\n", value);
    }
}

/**
 * streamFile:
 * @filename: the file name to parse
 *
 * Parse and print information about an XML file.
 */
static void
streamFile(const char *filename) {
    xmlTextReaderPtr reader;
    int ret;

    reader = xmlReaderForFile(filename, NULL, 0);
    if (reader != NULL) {
        ret = xmlTextReaderRead(reader);
        while (ret == 1) {
            processNode(reader);
            ret = xmlTextReaderRead(reader);
        }
        xmlFreeTextReader(reader);
        if (ret != 0) {
            fprintf(stderr, "%s : failed to parse\n", filename);
        }
    } else {
        fprintf(stderr, "Unable to open %s\n", filename);
    }
}

int main(int argc, char **argv) {
    if (argc != 2)
        return(1);

    /*
     * this initialize the library and check potential ABI mismatches
     * between the version it was compiled for and the actual shared
     * library used.
     */
    LIBXML_TEST_VERSION

    streamFile(argv[1]);

    /*
     * Cleanup function for the XML library.
     */
    xmlCleanupParser();
    /*
     * this is to debug memory for regression tests
     */
    xmlMemoryDump();
    return(0);
}

#else
int main(void) {
    fprintf(stderr, "XInclude support not compiled in\n");
    exit(1);
}
#endif

Agora tentei abrir um arquivo xml da internet mas nao deu certo, vejam:

 

cd '/home/logan/ex3'

logan@debian:~$ cd '/home/logan/ex3'

logan@debian:~/ex3$ '/home/logan/ex3/reader1' 'http://www.ovh.pt/produtos/dotie.xml'

error : Operation in progress

Unable to open http://www.ovh.pt/produtos/dotie.xml

logan@debian:~/ex3$

Alguém porderia me ajudar?

Como faço para acessar um XML pela internet?

Obrigado.

 

Gabriel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriel,

 

Para ler um arquivo da internet é preciso utilizar sockets.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estava querendo era fazer uma consulta num XML do WebService...

 

Agora descobri que existe um tal de axis2/c que é um servidor que dá suporte a essas consultas em C:

https://saloon.inf.ufrgs.br/twiki/view/Disciplinas/INF01151/ExercicioEmLaboratorio2008-2-05

 

Tem que pegar as DLL´s e colocar no system32...

Ai depois eu rodei um arquivo fonte de exemplo: http://ws.apache.org/axis2/c/docs/hello/client/hello.c.html

 

E vejam:

 

gcc.exe "C:\axis2c\bin\test.c" -o "C:\axis2c\bin\test.exe"    -I"C:\Dev-Cpp\include"  -I"C:\axis2c\include"   -L"C:\Dev-Cpp\lib" -L"C:\axis2c\lib" 
In file included from C:/Dev-Cpp/include/io.h:21,
                 from C:/Dev-Cpp/include/direct.h:22,
                 from C:/axis2c/include/platforms/windows/axutil_windows.h:48,
                 from C:/axis2c/include/platforms/axutil_platform_auto_sense.h:38,
                 from C:/axis2c/include/axutil_dll_desc.h:31,
                 from C:/axis2c/include/axutil_class_loader.h:31,

                 from C:/axis2c/include/axis2_util.h:24,
                 from C:\axis2c\bin\test.c:19:
C:/Dev-Cpp/include/stdint.h:27: error: conflicting types for 'int8_t'
C:/axis2c/include/axutil_utils_defines.h:38: error: previous declaration of 'int8_t' was here

C:/Dev-Cpp/include/stdint.h:28: error: redefinition of typedef 'uint8_t'
C:/axis2c/include/axutil_utils_defines.h:37: error: previous declaration of 'uint8_t' was here
C:/Dev-Cpp/include/stdint.h:29: error: redefinition of typedef 'int16_t'
C:/axis2c/include/axutil_utils_defines.h:40: error: previous declaration of 'int16_t' was here
C:/Dev-Cpp/include/stdint.h:30: error: redefinition of typedef 'uint16_t'
C:/axis2c/include/axutil_utils_defines.h:39: error: previous declaration of 'uint16_t' was here

C:/Dev-Cpp/include/stdint.h:31: error: conflicting types for 'int32_t'
C:/axis2c/include/axutil_utils_defines.h:42: error: previous declaration of 'int32_t' was here
C:/Dev-Cpp/include/stdint.h:32: error: conflicting types for 'uint32_t'
C:/axis2c/include/axutil_utils_defines.h:41: error: previous declaration of 'uint32_t' was here
C:/Dev-Cpp/include/stdint.h:33: error: redefinition of typedef 'int64_t'
C:/axis2c/include/axutil_utils_defines.h:44: error: previous declaration of 'int64_t' was here
C:/Dev-Cpp/include/stdint.h:34: error: redefinition of typedef 'uint64_t'
C:/axis2c/include/axutil_utils_defines.h:43: error: previous declaration of 'uint64_t' was here

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.