Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Sử dụng thư viện libxml2 để parse file .xml nhưng chạy không đúng?

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    38

    Mặc định Sử dụng thư viện libxml2 để parse file .xml nhưng chạy không đúng?

    Chào các bác, iem hôm nay thử cài thư viện libxml2 ( xmlsoft.org ) bằng lệnh để thử lọc mấy cái file .xml (cụ thể là em muốn lọc file RSS )
    Em sau khi cài đặt rồi complie theo hướng dẫn, nhưng kết quả lại ko đúng như mong muốn, bị lỗi. Nên em ko hiểu là tại em cài chỗ nào sai, hay thiếu cái options nào , hay tại cái thư viện này bị lỗi (n` người xài + khen hay nên chắc cũng ko đến nỗi đọc 1 file đơn giản mà ko làm đc).
    Cả quán trình nó thứ tự là như sau:
    1. Đầu em tải libxml2 bản dev về :
    Code:
    sudo apt-get intall libxml2-dev
    2. Em copy luôn cái code: ( ta tạm gọi là test.c đi )
    C Code:
    1. #include <stdio.h>
    2. #include <libxml/parser.h>
    3. #include <libxml/tree.h>
    4.  
    5. static void print_element_names(xmlNode * a_node);
    6.  
    7. int
    8. main()
    9. {
    10.  
    11.         xmlDoc         *doc = NULL;
    12.         xmlNode        *root_element = NULL;
    13.         const char     *Filename = "/tmp/config.xml";
    14.  
    15.         doc = xmlReadFile(Filename, NULL, 0);
    16.  
    17.         if (doc == NULL)
    18.           {
    19.                   printf("error: could not parse file %s\n", Filename);
    20.           }
    21.         else
    22.           {
    23.  
    24.                   /*
    25.                    * Get the root element node
    26.                    */
    27.                   root_element = xmlDocGetRootElement(doc);
    28.  
    29.                   print_element_names(root_element);
    30.  
    31.                   /*
    32.                    * free the document
    33.                    */
    34.                   xmlFreeDoc(doc);;
    35.           }
    36.         /*
    37.          *Free the global variables that may
    38.          *have been allocated by the parser.
    39.          */
    40.         xmlCleanupParser();
    41.  
    42.         return (0);
    43.  
    44. }
    45.  
    46. /* Recursive function that prints the XML structure */
    47.  
    48. static void
    49. print_element_names(xmlNode * a_node)
    50. {
    51.     xmlNode *cur_node = NULL;
    52.  
    53.     for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
    54.         if (cur_node->type == XML_ELEMENT_NODE) {
    55.             printf("node type: Element, name: %s\n", cur_node->name);
    56.         }
    57.  
    58.         print_element_names(cur_node->children);
    59.     }
    60. }

    3. Lên mạng lượm đại 1 cái code xml :
    XML Code:
    1. <note>
    2. <to>Tove</to>
    3. <from>Jani</from>
    4. <heading>Reminder</heading>
    5. <body>Don't forget me this weekend!</body>
    6. </note>

    4. Complie :
    Code:
    gcc test.c -lxml2 -I/usr/include/libxml2
    5. Và kết quả :
    Code:
    node type: Element, name: note
    node type: Element, name: to
    node type: Element, name: from
    node type: Element, name: heading
    node type: Element, name: body
    ** Lần 2 : Em thử với 1 code test.c khác:
    C Code:
    1.     /*
    2.     <ROOT>
    3.            <CHILD  id="attribute"  value="1"  />
    4.            <CHILD  id="attribute"  value="1"  />
    5.     </ROOT>        
    6.  
    7.     compile:
    8.  
    9.     //  g++  filename.cpp  -o  exefilename  `xml2-config  --cflags  --libs`
    10.  
    11.     */
    12.     //  xml  parsing  example
    13.     //  Reading  element  from  xml  file
    14.  
    15.     #include   <stdio.h>
    16.     #include   <string.h>
    17.     #include   <stdlib.h>
    18.     #include   <libxml/xmlmemory.h>
    19.     #include   <libxml/parser.h>
    20.  
    21.     void getReference (xmlDocPtr doc, xmlNodePtr cur) {
    22.         xmlChar *uri;
    23.         xmlChar *value;
    24.         cur = cur->xmlChildrenNode;
    25.         while (cur != NULL) {
    26.             if ((!xmlStrcmp(cur->name, (const xmlChar *)"setting"))) {
    27.                 uri = xmlGetProp(cur,(const xmlChar*) "id");
    28.                 value = xmlGetProp(cur,(const xmlChar*) "value");
    29.                 printf("uri: %s,  value:%s\n", uri,value);
    30.                 xmlFree(uri);
    31.             }
    32.             cur = cur->next;
    33.         }
    34.         return;
    35.     }
    36.     void parseDoc(char *docname) {
    37.         xmlDocPtr doc;
    38.         xmlNodePtr cur;
    39.         doc = xmlParseFile(docname);
    40.         if (doc == NULL ) {
    41.             fprintf(stderr,"Document not parsed successfully. \n");
    42.             return;
    43.         }
    44.         cur = xmlDocGetRootElement(doc);
    45.         if (cur == NULL) {
    46.             fprintf(stderr,"empty document\n");
    47.             xmlFreeDoc(doc);
    48.             return;
    49.         }
    50.         if (xmlStrcmp(cur->name, (const xmlChar *) "settings")) {
    51.             //fprintf(stderr,"document  of  the  wrong  type,  root  node  !=  story",  xmlFreeDoc(doc));
    52.             printf("root error\n");
    53.             return;
    54.         }
    55.         getReference (doc, cur);
    56.         xmlFreeDoc(doc);
    57.         return;
    58.       }
    59.  
    60.       int main(int argc, char **argv) {
    61.         char *docname;
    62.         if (argc <= 1) {
    63.             printf("Usage: %s docname\n", argv[0]);
    64.             return(0);
    65.         }
    66.         docname = argv[1];
    67.         parseDoc (docname);
    68.         return (1);
    69.             }

    - Với cùng file .xml như trên
    - Complie :
    Code:
    gcc  test.c  -o run -I/usr/include/libxml2 -lxml2
    - Kết quả là :
    Code:
    root error
    Đã được chỉnh sửa lần cuối bởi tuanc : 02-04-2012 lúc 01:35 AM.

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Thì cái code thứ 2 cho ra kết quả thế là đúng rồi, code không sai mà bạn sai. Nói đơn giản là trong xml của bạn không có tag "settings" nên đương nhiên xmlStrcmp(cur->name, (const xmlChar *) "settings") trả về sai.

    Hãy học lập trình căn bản trước, khi copy cũng nên xem cái code bạn copy nó làm gì (cả 2 đề tài bạn mới gửi đều là lỗi thiếu kiến thức cơ bản, Kevin chỉ trả lời 1, còn lại tự suy nghĩ và debug). Một điều rất quan trọng khác để cho những người có kiến thức tốt giúp bạn đó là bạn cần phải tìm hiểu luật lệ tham gia, và đưa một đề tài có tiêu đề rõ ràng.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Parse dữ liệu qua các thẻ web
    Gửi bởi duyttt trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 0
    Bài viết cuối: 27-10-2013, 04:10 PM
  2. Biểu thức Regex chạy trong Expresso thì đúng nhưng chạy trong visual studio lại sai
    Gửi bởi rossoneri trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 30-06-2012, 02:58 PM
  3. Kỹ thuật C++ Cách sử dụng libxml2 và libxml++ trong RedHat Linux?
    Gửi bởi Peter_Pan trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 1
    Bài viết cuối: 14-04-2012, 07:02 PM
  4. lỗi parse error before ')', các bạn cho mình hỏi đây là lỗi j
    Gửi bởi ndhbk trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 28-11-2010, 11:46 PM
  5. CT chạy đúng kết quả với BC 3.1 nhưng không đúng với BC 5.02
    Gửi bởi PGD trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 03-01-2010, 03:00 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn