解析XML檔案!把對應的項printf出來

2021-06-17 01:31:38 字數 4696 閱讀 7920

首先給大家乙個解析xml的源**,自己可以隨意的改寫 (

1)xml解析流程

解析乙個

xml文件,從中取出想要的資訊,例如節點中包含的文字,或者某個節點的屬性。其流程如下:①用

xmlreadfile

函式讀入乙個檔案,並返回乙個文件指標

doc。②用

xmldocgetrootelement

函式得到根節點

curnode。③

此時curnode->xmlchildrennode

就是根節點的首個兒子節點,該兒子節點的兄弟節點可用

next

指標進行輪詢。

④輪詢所有子節點,找到所需的節點,用

xmlnodegetcontent

取出其內容。⑤用

xmlhasprop

查詢含有某個屬性的節點,屬性列表指標

xmlattrptr

將指向該節點的屬性列表。

⑥取出該節點的屬性,用

xmlgetprop

取出其屬性值。

⑦xmlfreedoc

函式關閉文件指標,並清除本文件中所有節點動態申請的記憶體。(2

)xml

解析舉例

par***mlfile.c

源**如下:

#include

#include

#include

intmain(int argc, char* argv)

szdocname= argv[1];

doc =xmlreadfile(szdocname,"gb2312",xml_parse_recover); //

解析檔案

//檢查解析文件是否成功,如果不成功,

libxml

將報錯並停止解析。

//乙個常見錯誤是不適當的編碼,

xml標準文件除了用

utf-8

或utf-16

外還可用其它編碼儲存

if(null == doc)

//獲取根節點

curnode= xmldocgetrootelement(doc);

if(null == curnode)

//確認根元素名字是否符合

if(xmlstrcmp(curnode->name, bad_cast "root"))

curnode= curnode->xmlchildrennode;

xmlnodeptrpropnodeptr = curnode;

while(curnode!= null)

//查詢帶有屬性

attribute

的節點if(xmlhasprop(curnode,bad_cast "attribute"))

curnode = curnode->next; }

//查詢屬性

xmlattrptr attrptr =propnodeptr->properties;

while (attrptr != null)

attrptr = attrptr->next; }

xmlfreedoc(doc);

return 0; }

編譯gcc par***mlfile.c -opar***mlfile -i/usr/local/include/libxml2 -lxml2。執行

./par***mlfile createxml.xml

結果就會顯示在螢幕上。

接下來我要做的就是運用上面的源**將我自己的xml檔案解析出來。

#include

#include //設定插入點

#include //字元處理

#include //定義錯誤碼

#include //浮點數處理

#include //定義各種資料型別最值常量

#include //定義本地化函式

#include //定義數學函式

#include //定義輸入/輸出函式

#include //定義雜項函式及記憶體分配函式

#include //字串處理

#include //定義關於時間的函式

#include //寬字元處理及輸入/輸出

#include

#include

#include

int main(int argc, char* argv)

memset(line,0,sizeof(line));

if( null == fread(line,1,sizeof(line)-1,fp))

printf( "----- :%s\n",line );

ret  = gb18030toutf8(line,strlen(line),dest_gb18030,1024*512);

// ret  = gb18030toutf8(dest_gb18030,strlen(dest_gb18030),dest_utf8,80);

//printf( "ret=%d\n\n\n",ret);

//printf( "gb18030:%s\n",line );

printf( " utf-8:%s\n\n\n\n\n\n", dest_gb18030 );

ret  = utf8togb18030(dest_gb18030,strlen(dest_gb18030),dest_utf8,1024*512);

// printf( "ret=%d\n\n\n ",ret);

// printf( " utf-8:%s\n ",dest_gb18030);

// printf( "gb18030:%s\n ",dest_utf8);

//   xmldocptr doc;           //定**析檔案指標

//   xmlnodeptr curnode;      //定義結點指標

//   xmlchar *szkey;          //臨時字串變數

// char *szdocname;

doc = xmlreadmemory(dest_gb18030,sizeof(dest_gb18030),szdocname,"utf-8",xml_parse_recover);

// xmlreadmemory這個函式的作用是讀出記憶體的,因為我是先轉換後解析的,所有我要把我自己轉換出來的xml檔案解析出來,就要把那段記憶體讀出來。原來的xmlreadfile是用來讀檔案的。

//   doc = xmlreadfile(szdocname,"gb18030",xml_parse_recover);

if (null == doc)

curnode = xmldocgetrootelement(doc);

if (null == curnode)

printf("@@@@@@@@@@@@@@@@@%s\n",curnode->name);

if (xmlstrcmp(curnode->name, bad_cast "print_task")) 

//上面這個if 語句是用來做對比的,如果因為我不知道我的curnode->name會指到**,所以我在上面寫了乙個printf語句找到了這個位置,就是我要解析的xml檔案的print_task處。

curnode = curnode->xmlchildrennode;

xmlnodeptr propnodeptr = curnode;

while(curnode != null)

else if ((!xmlstrcmp(curnode->name, (const xmlchar *) "line")))

if (xmlhasprop(curnode,bad_cast "align"))

curnode = curnode->next;

}//查詢屬性

xmlattrptr attrptr = propnodeptr->properties;

while (attrptr != null)

attrptr = attrptr->next;

}xmlfreedoc(doc);

return 0;

}這是我修改的源**,改動的地方我已經做出了注釋

接著我的**還需要乙個動態庫來鏈結

#include

#include

#include

#include

int utf8togb18030(const char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)

int gb18030toutf8(const char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen)

動態庫的**已給出,現在要做的就是生成動態庫

gcc -shared -fpic -o libmy.so iconv1.c

然後在做解析

gcc-i/root/czy/test/libxml/libxml2-2.9.0/include -o t main.c -l./ -lmy -lxml2-l/root/czy/test/libxml/libiconv-1.14/lib/.libs –liconv

接著執行./t 就會得到了我們所要的檔案了

這裡給出乙個需要注意的地方,如果 ./t 沒有出現結果,反而出錯了,這可能就是因為我們沒有定義環境變數

export ld_library_path=$ld_library_path:./

xml檔案對應的DTD學習

dtd檔案 1.dtd文件主要由 元素,屬性,實體,pcdata,cdata 2.宣告乙個元素 eg 特殊元素 結果類詩如下 效果 帶有任何內容的元素 eg 3.當最後只有pcdata元素時 元素內容 pcdata eg 4.帶有子元素的元素 eg 5.在預設的情況下,宣告的元素都是只出現一次的。在...

XML檔案的解析

首先,讀取xml檔案,假如我們把myxml.xml檔案放在了sd卡的xml資料夾下 load方法 public static document load string path catch exception ex return document 呼叫load方法 string path envir...

生成XML檔案的步驟 解析XML檔案

生成xml檔案的步驟 1.初始化乙個xml的序列化器 xmlserializer serializer xml.newserializer 2.設定序列化器的引數 serializer.setoutput os,utf 8 3.寫資料 serializer.startdocument utf 8 t...