2013-08-28 5 views
-1

Я извлек этот код (как работает) из проекта. Поскольку я не осведомлен о libXML или XML Я не могу решить эту проблему. Файл XML здесь linkУзлы возвращаются пустым с libXML2

Я получаю выход:

Error: empty set as a result of evaluation xpath expression "/SOA/sehirler[0]/Bolge" 
Error: empty set as a result of evaluation xpath expression "/SOA/sehirler[0]/Peryot" 
Error: empty set as a result of evaluation xpath expression "/SOA/sehirler[0]/İli" 
Error: empty set as a result of evaluation xpath expression "/SOA/sehirler[0]/Durum" 
Error: empty set as a result of evaluation xpath expression "/SOA/sehirler[0]/Mak" 
Segmentation fault 

В отличие от просто получить

İstanbul 

в консоли вывода.

Может быть скомпилирован с этим

gcc -Wall main.c -o out $(pkg-config --cflags --libs glib-2.0 libxml-2.0) 

Ниже работает код для вставки в main.c

#include <glib-2.0/glib.h> 

#include <libxml/tree.h> 
#include <libxml/parser.h> 
#include <libxml/xpath.h> 
#include <libxml/xpathInternals.h> 

typedef struct weatherXmlSourceNode { 
    char *bolge, *peryot, *ili, *durum; 
    int mak; 
} weatherSource; 
weatherSource *wsrc[6]; 

xmlDocPtr doc; 

char *grabNodeFromFile(xmlDocPtr xml_doc, char* nodeName, int item_index) { 
    char xpath[64]; 
    xmlXPathContextPtr xpathCtx; 
    xmlXPathObjectPtr xpathObj; 
    xmlNodeSetPtr nodeset; 

    sprintf(xpath, "/SOA/sehirler[%d]/%s",item_index,nodeName); 

    xpathCtx = xmlXPathNewContext(xml_doc); 

    if(xpathCtx == NULL) { 
    fprintf(stderr,"Error: unable to create new XPath context\n"); 
    return(NULL); 
    } 

    /* Evaluate xpath expression */ 
    xpathObj = xmlXPathEvalExpression((xmlChar *)xpath, xpathCtx); 
    xmlXPathFreeContext(xpathCtx); 
    if(xpathObj == NULL) { 
    fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpath); 
    return(NULL); 
    } 

    /* Check if xmlXPathEvalExpression had returned nonempty nodeset*/ 
    if (xmlXPathNodeSetIsEmpty(xpathObj->nodesetval)) { 
    fprintf(stderr,"Error: empty set as a result of evaluation xpath expression \"%s\"",xpath); 
    xmlXPathFreeObject (xpathObj); 
    return(NULL); 
    } 

    nodeset = xpathObj->nodesetval; 

    //there should be only one node in nodeset. So we return contents of the first node in nodeset 
    return (char *)xmlNodeListGetString(xml_doc, nodeset->nodeTab[0]->xmlChildrenNode,1); 
} 

void fill_entry_from_rss(weatherSource *wsrc, xmlDocPtr filename, int doc_index) { 
    /* Fill respective elements */ 
    wsrc->bolge = grabNodeFromFile(filename, "Bolge", doc_index); 
    wsrc->peryot = grabNodeFromFile(filename, "Peryot", doc_index); 
    wsrc->ili = grabNodeFromFile(filename, "İli", doc_index); 
    wsrc->durum = grabNodeFromFile(filename, "Durum", doc_index); 
    wsrc->mak = grabNodeFromFile(filename, "Mak", doc_index); 
} 

int fill_entry_from_rss_loop() { 
    //int doc_item_index = 1; 
    /* Load XML documents */ 
    doc = xmlParseFile("sonSOA.xml"); 
    if (doc == NULL) { 
    fprintf(stderr, "Error: unable to parse file \"sonSOA.xml\"\n"); 
    return(0); 
    } 
    /* Allocate memory for weather struct */ 
    int num = 6; 
    while (num > 0) { 
    wsrc[(num - 1)] = g_new0(weatherSource, 1); 
    num--; 
    } 
    /* Fill rss entries from their respective fields */ 
    fill_entry_from_rss(wsrc[0], doc, 0); 
    printf("%s\n", wsrc[0]->ili); 
    xmlFreeDoc(doc); 
    return 1; 
} 
int main() { 
    fill_entry_from_rss_loop(); 
    return 0; 
} 
+0

Демо вход с по выходу, а также ожидаемые результаты будут реально помочь предотвращению downvotes (и, возможно, дают фактическое решение проблемы. Также засучить рукава и RTFM. – drahnr

+0

Добавлено ожидается против текущего производства. Кроме того, я прочитал инструкцию Кроме того, у меня был этот код, работающий с rss-стандартом, но когда я ввел его в работу с простым XML-файлом, он терпит неудачу. Простой «хедз-ап, вы используете неправильную методологию» или «неправильный тип пути» был бы приятным @drahnr – whotheman

+1

@whotheman добавить stacktrace или gdb backtrace, желательно с _handtyped_ (запретить копирование символов voodoo, если таковые имеются) mini test xml. 'grabNodeFromFile' действительно выглядит нормально. – drahnr

ответ

1

Отвечая на мой собственный вопрос, 2 ошибки присутствовали в этом коде. Прежде всего, узлы xml начинаются с 1, а не 0, когда они перечислены. Кроме того, свойство «ili» из xml было ошибочно принято как «İli» в моем коде, так что это тоже исправлено. Рабочий код выглядит следующим образом.

#include <glib-2.0/glib.h> 

#include <libxml/tree.h> 
#include <libxml/parser.h> 
#include <libxml/xpath.h> 
#include <libxml/xpathInternals.h> 

typedef struct weatherXmlSourceNode { 
    char *bolge, *peryot, *ili, *durum; 
    int mak; 
} weatherSource; 
weatherSource *wsrc[6]; 

xmlDocPtr doc; 

char *grabNodeFromFile(xmlDocPtr xml_doc, char* nodeName, int item_index) { 
    char xpath[64]; 
    xmlXPathContextPtr xpathCtx; 
    xmlXPathObjectPtr xpathObj; 
    xmlNodeSetPtr nodeset; 

    sprintf(xpath, "/SOA/sehirler[%d]/%s",item_index,nodeName); 

    xpathCtx = xmlXPathNewContext(xml_doc); 

    if(xpathCtx == NULL) { 
    fprintf(stderr,"Error: unable to create new XPath context\n"); 
    return(NULL); 
    } 

    /* Evaluate xpath expression */ 
    xpathObj = xmlXPathEvalExpression((xmlChar *)xpath, xpathCtx); 
    xmlXPathFreeContext(xpathCtx); 
    if(xpathObj == NULL) { 
    fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n", xpath); 
    return(NULL); 
    } 

    /* Check if xmlXPathEvalExpression had returned nonempty nodeset*/ 
    if (xmlXPathNodeSetIsEmpty(xpathObj->nodesetval)) { 
    fprintf(stderr,"Error: empty set as a result of evaluation xpath expression \"%s\"",xpath); 
    xmlXPathFreeObject (xpathObj); 
    return(NULL); 
    } 

    nodeset = xpathObj->nodesetval; 

    //there should be only one node in nodeset. So we return contents of the first node in nodeset 
    return (char *)xmlNodeListGetString(xml_doc, nodeset->nodeTab[0]->xmlChildrenNode,1); 
} 

void fill_entry_from_rss(weatherSource *wsrc, xmlDocPtr filename, int doc_index) { 
    /* Fill respective elements */ 
    wsrc->bolge = grabNodeFromFile(filename, "Bolge", doc_index); 
    wsrc->peryot = grabNodeFromFile(filename, "Peryot", doc_index); 
    wsrc->ili = grabNodeFromFile(filename, "ili", doc_index); 
    wsrc->durum = grabNodeFromFile(filename, "Durum", doc_index); 
    wsrc->mak = grabNodeFromFile(filename, "Mak", doc_index); 
} 

int fill_entry_from_rss_loop() { 
    //int doc_item_index = 1; 
    /* Load XML documents */ 
    doc = xmlParseFile("sonSOA.xml"); 
    if (doc == NULL) { 
    fprintf(stderr, "Error: unable to parse file \"sonSOA.xml\"\n"); 
    return(0); 
    } 
    /* Allocate memory for weather struct */ 
    int num = 6; 
    while (num > 0) { 
    wsrc[(num - 1)] = g_new0(weatherSource, 1); 
    num--; 
    } 
    /* Fill rss entries from their respective fields */ 
    fill_entry_from_rss(wsrc[0], doc, 1); 
    printf("%s\n", wsrc[0]->ili); 
    xmlFreeDoc(doc); 
    return 1; 
} 
int main() { 
    fill_entry_from_rss_loop(); 
    return 0; 
} 
Смежные вопросы