XML簡單解析程式__C實現

來源:互聯網
上載者:User
最近一段時間總是用C和WEBSERVICE進行一些資料的互動,所以不得不用XML這些東西,用C寫死剖析器總是不太好,稍做更改就是改程式,太麻煩。 所以,在用這些之前,自已寫了點XML的解析小測試,感覺不是很難,拿出來和大家分享,如果您是高手,請不要見笑,如果您從中學到了點東西,那我非常高興,不妥之處警請指正:  

#include <libxml/xmlreader.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>

#define TEST


char * get_xml_value(xmlTextReaderPtr reader);
char * get_xml_key(xmlTextReaderPtr reader);
int parse_xml(const char *xml_buf, int xml_buf_size);

#ifdef TEST
int main()
{

 
    char *xml_buf = "<xmlTest xmlns=/"http://www.openuri.org//"><userName>1234567</userName><dstFolder>dddd</dstFolder><subject>test</subject></xmlTest>";
    parse_xml(xml_buf, strlen(xml_buf)); /*這裡只是測試,不對傳回值做判斷*/
    return 0;
}
#endif

/*分解提交過來的XML串,當然也可以是一個檔案,只要更改相關調用函數*/
int parse_xml(const char *xml_buf, int xml_buf_size)
{
    int ret = 0;
    int node_depth = 0;
    int node_type = 0;
    xmlTextReaderPtr xml_reader;

    xml_reader = xmlReaderForMemory(xml_buf, xml_buf_size, NULL, NULL, 0);
    if (NULL == xml_reader) {
        return -1;
    }

    while (1 == (ret = xmlTextReaderRead(xml_reader))) {

    
/*  這塊是判斷節點深度的,您可以對分解深度做一個限制
        node_depth = xmlTextReaderDepth(xml_reader);
        if (5 < node_depth) {
            ret = -2;
            break;
        }
*/

        /*判斷當前節點的類型*/
        node_type = xmlTextReaderNodeType(xml_reader);
        switch(node_type) {
            case 1:
                get_xml_key(xml_reader);
                break;
            case 3:
                get_xml_value(xml_reader);
                break;

        }
    }

    xmlFreeTextReader(xml_reader);
    return ret;
}

/*取得當前節點的KEY值*/
char * get_xml_key(xmlTextReaderPtr reader)
{
    const xmlChar *key;
    key = xmlTextReaderConstName(reader);
    if (NULL == key) {
        return NULL;
    }
    printf("KEY : %s/n", key);
}
/*取得當前節點的VALUE值*/
char * get_xml_value(xmlTextReaderPtr reader)
{
    const xmlChar *value;

    value = xmlTextReaderConstValue(reader);
    if (NULL == value) {
        return NULL;
    }
    printf("VALUE : %s/n", value);
}

上述程式,結果一運行遍知。

前提是您必須安裝LIBXML的庫,可到http://xmlsoft.org/去下載,上面有詳細的文檔。

編譯時間要指定LIBXML的標頭檔路徑和庫的路徑

gcc -I/xxx/libxml/include/libxml2 -L/xxx/libxml/lib -lxml2 -g -o target source.c

 

引用:http://blog.chinaunix.net/u/18768/showart_316081.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.