日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

libxml -- 解析 XML 文档

發(fā)布時間:2024/1/17 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libxml -- 解析 XML 文档 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考

  • http://xmlsoft.org/
  • http://www.miidoo.cn/info_detail-204.html
  • http://www.blogjava.net/wxb_nudt/archive/2007/11/28/161340.html
  • http://www.ibm.com/developerworks/cn/aix/library/au-libxml2.html
  • http://www.cppblog.com/lymons/archive/2009/03/30/37553.html
  • XPath 教程
  • XML

    介紹:XML 和 DOM

    XML是eXtensible Markup Language的縮寫,它是一種可擴(kuò)展性標(biāo)識語言, 能夠讓 你自己創(chuàng)造標(biāo)識,標(biāo)識你所表示的內(nèi)容。DOM全稱是Document Object Model(文檔 對象模型),定義了一組與平臺和語言無關(guān)的接口,以便程序和腳本能夠動態(tài)訪問 和修改XML文檔內(nèi)容、結(jié)構(gòu)及樣式。XML創(chuàng)建了標(biāo)識,而 DOM的作用就是告訴程序 如何操作和顯示這些標(biāo)識。

    XML將數(shù)據(jù)組織成為一棵樹,DOM通過解析XML文檔,為XML文檔在邏輯上建立一個 樹模型,樹的節(jié)點是一個個的對象。這樣通過操作這棵樹和這些對象就可以完成 對XML文檔的操作,為處理文檔的所有方面提供了一個完美的概念性框架。

    XML 中共有12種節(jié)點類型,其中最常見的節(jié)點類型有5種:

    元素
    元素是 XML 的基本組成單元。,描述XML的基本信息。
    屬性
    屬性節(jié)點包含關(guān)于元素節(jié)點的信息,通常包含在元素里面,描述元素的 屬性。
    文本
    包含許多文本信息或者只是空白。
    文檔
    文檔節(jié)點是整個文檔中所有其它節(jié)點的父節(jié)點。
    注釋
    注釋是對相關(guān)的信息進(jìn)行描述、注釋。

    libxml

    介紹

    本文所介紹的 libxml 是針對 C 語言的一套 API 接口。其他如 ruby,python 亦有對應(yīng)的基于 libxml 開發(fā)的綁定庫接口。

    數(shù)據(jù)類型 — xmlChar

    在 libXml 中用 xmlChar 替代 char , XML 使用 UTF-8 編碼的一字節(jié)字符串。如 果你的數(shù)據(jù)使用其它編碼,它必須被轉(zhuǎn)換到 UTF-8 才能使用libxml的函數(shù)。

    如同標(biāo)準(zhǔn) C 中的 char 類型一樣, xmlChar 也有動態(tài)內(nèi)存分配、字符串操作等 相關(guān)函數(shù)。例如 xmlMalloc 是動態(tài)分配內(nèi)存的函數(shù); xmlFree 是配套的釋放內(nèi) 存函數(shù); xmlStrcmp 是字符串比較函數(shù)等等。基本上 xmlChar 字符串相關(guān)函數(shù) 都在xmlstring.h 中定義;而動態(tài)內(nèi)存分配函數(shù)在 xmlmemory.h 中定義。另外要 注意,因為總是要在 xmlChar* 和 char* 之間進(jìn)行類型轉(zhuǎn)換,所以定義了一個宏 BAD_CAST ,其定義如下: xmlstring.h

    #define BAD_CAST (xmlChar *)

    原則上來說, unsigned char 和 char 之間進(jìn)行強制類型轉(zhuǎn)換是沒有問題的。

    數(shù)據(jù)結(jié)構(gòu)

    xmlDoc
    代表DOM結(jié)構(gòu)中的文檔類型。包含由解析文檔建立的樹結(jié)構(gòu), xmlDocPtr 是指向這個結(jié)構(gòu)的指針。
    xmlNode
    代表DOM結(jié)構(gòu)中的除文檔類型類型外的其它節(jié)點類型。包含單一結(jié)點 的結(jié)構(gòu), xmlNodePtr 是指向這個結(jié)構(gòu)的指針,它被用于遍歷文檔樹。節(jié)點應(yīng) 該是xml中最重要的元素了, xmlNode 代表了xml文檔中的一個節(jié)點,實現(xiàn)為一 個 struct ,內(nèi)容很豐富: tree.h
    typedef struct _xmlNode xmlNode; typedef xmlNode *xmlNodePtr; struct _xmlNode {void *_private;/* application data */xmlElementType type; /* type number, must be second ! */const xmlChar *name; /* the name of the node, or the entity */struct _xmlNode *children; /* parent->childs link */struct _xmlNode *last; /* last child link */struct _xmlNode *parent;/* child->parent link */struct _xmlNode *next; /* next sibling link */struct _xmlNode *prev; /* previous sibling link */struct _xmlDoc *doc;/* the containing document *//* End of common part */xmlNs *ns; /* pointer to the associated namespace */xmlChar *content; /* the content */struct _xmlAttr *properties;/* properties list */xmlNs *nsDef; /* namespace definitions on this node */void *psvi;/* for type/PSVI informations */unsigned short line; /* line number */unsigned short extra; /* extra data for XPath/XSLT */ };

    可以看到,節(jié)點之間是以鏈表和樹兩種方式同時組織起來的,next和prev指針可 以組成鏈表,而parent和children可以組織為樹。所有節(jié)點都是文檔 xmlDoc 節(jié) 點的直接或間接子節(jié)點。同時還有以下重要元素:

    • 節(jié)點中的文字內(nèi)容: content ;
    • 節(jié)點所屬文檔: doc ;
    • 節(jié)點名字: name ;
    • 節(jié)點的 namespace: ns ;
    • 節(jié)點屬性列表: properties ;

    xml 文檔的操作其根本原理就是在節(jié)點之間移動、查詢節(jié)點的各項信息,并進(jìn)行 增加、刪除、修改的操作。 xmlDocSetRootElement 函數(shù)可以將一個節(jié)點設(shè)置為 某個文檔的根節(jié)點,這是將文檔與節(jié)點連接起來的重要手段,當(dāng)有了根結(jié)點以 后,所有子節(jié)點就可以依次連接上根節(jié)點,從而組織成為一個 xml 樹。

    創(chuàng)建 XML 文檔

    創(chuàng)建一個 XML 文檔流程如下:

  • 用 xmlNewDoc 函數(shù)創(chuàng)建一個文檔指針 doc;
  • 用 xmlNewNode 函數(shù)創(chuàng)建一個節(jié)點指針 root_node;
  • 用 xmlDocSetRootElement 將 root_node 設(shè)置為 doc 的根節(jié)點;
  • 給 root_node 添加一系列子節(jié)點,并設(shè)置字節(jié)點的內(nèi)容和屬性;
  • 用 xmlSaveFile 保存 xml 到文件;
  • 用 xmlFreeDoc 函數(shù)關(guān)閉文檔指針,清除內(nèi)存。
  • 示例

    下面用一個例子說明一些函數(shù)的使用,和創(chuàng)建一個 XML 文檔的大致步驟:

    #include <stdio.h> #include <stdlib.h> #include <libxml/parser.h> #include <libxml/tree.h>int main (int argc, char **argv) {xmlDocPtr pdoc = NULL;xmlNodePtr proot_node = NULL,pnode = NULL,pnode1 = NULL;// 創(chuàng)建一個新文檔并設(shè)置 root 節(jié)點 // 一個 XML 文件只有一個 root 節(jié)點 pdoc = xmlNewDoc (BAD_CAST "1.0");proot_node = xmlNewNode (NULL, BAD_CAST "根節(jié)點");xmlNewProp (proot_node, BAD_CAST "版本", BAD_CAST "1.0");xmlDocSetRootElement (pdoc, proot_node);pnode = xmlNewNode (NULL, BAD_CAST "子節(jié)點1");// 創(chuàng)建上面 pnode 的子節(jié)點 xmlNewChild (pnode, NULL, BAD_CAST "子子節(jié)點1", BAD_CAST "信息");// 添加子節(jié)點到 root 節(jié)點 xmlAddChild (proot_node, pnode);pnode1 = xmlNewNode (NULL, BAD_CAST "子子節(jié)點1");xmlAddChild (pnode, pnode1);xmlAddChild (pnode1,xmlNewText (BAD_CAST "這是更低的節(jié)點,子子子節(jié)點1"));// 還可以這樣直接創(chuàng)建一個子節(jié)點到 root 節(jié)點上 xmlNewTextChild (proot_node, NULL, BAD_CAST "子節(jié)點2", BAD_CAST "子節(jié)點2的內(nèi)容");xmlNewTextChild (proot_node, NULL, BAD_CAST "子節(jié)點3", BAD_CAST "子節(jié)點3的內(nèi)容");// 保存 xml 為文件,如果沒有給出文件名參數(shù),就輸出到標(biāo)準(zhǔn)輸出 xmlSaveFormatFileEnc (argc > 1 ? argv[1]:"-", pdoc, "UTF-8", 1);// 釋放資源 xmlFreeDoc (pdoc);xmlCleanupParser ();xmlMemoryDump ();return 0; }

    編譯這個例子,先看看系統(tǒng)里面的 libxml2 庫的 pkgconfig 信息:

    root@jianlee:~/lab/xml# cat /usr/lib/pkgconfig/libxml-2.0.pc prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include modules=1Name: libXML Version: 2.6.32 Description: libXML library version2. Requires: Libs: -L${libdir} -lxml2 Libs.private: -lz -lm Cflags: -I${includedir}/libxml2root@jianlee:~/lab/xml# pkg-config libxml-2.0 --cflags --libs -I/usr/include/libxml2 -lxml2

    編譯:

    root@jianlee:~/lab/xml# gcc -Wall `pkg-config libxml-2.0 --cflags --libs` create_xml.c

    如果沒有修改源程序,輸出應(yīng)該是這樣:

    root@jianlee:~/lab/xml# ./a.out <?xml version="1.0" encoding="UTF-8"?> <根節(jié)點 版本="1.0"><子節(jié)點1><子子節(jié)點1>信息</子子節(jié)點1><子子節(jié)點1>這是更低的節(jié)點,子子子節(jié)點1</子子節(jié)點1></子節(jié)點1><子節(jié)點2>子節(jié)點2的內(nèi)容</子節(jié)點2><子節(jié)點3>子節(jié)點3的內(nèi)容</子節(jié)點3> </根節(jié)點>

    示例補充說明

    輸出的各節(jié)點不要在一行

    上面使用下面方式保存 xml 文檔,輸出的文件各子節(jié)點間自動加入回車:

    // 保存 xml 為文件,如果沒有給出文件名參數(shù),就輸出到標(biāo)準(zhǔn)輸出xmlSaveFormatFileEnc (argc > 1 ? argv[1]:"-", pdoc, "UTF-8", 1);

    如果把上面的 1 換成 0 ,輸出格式是放在一行。

    用到的函數(shù)說明

    上面涉及幾個函數(shù)和類型定義,不過意思很明了,下面解釋一個(重要的是自己 動手寫程序,反復(fù)實驗,所謂熟能生巧)。

    xmlDocPtr
    指向 XML 文檔對象的指針
    xmlNodePtr
    指向 XML 文檔對象中的節(jié)點對象(根節(jié)點和子節(jié)點都是一樣的)
    xmlNewDoc
    創(chuàng)建一個 XML 文檔對象
    xmlNewNode
    創(chuàng)建一個 XML 文檔的指針對象
    xmlNewProp
    給一個節(jié)點增加屬性信息,包括在 <> 中,如:
    xmlNewProp (proot_node, BAD_CAST "版本", BAD_CAST "1.0");

    最后顯示是這個樣子:

    <根節(jié)點 版本="1.0"> xmlDocSetRootElement
    設(shè)置 XML 文檔對象的根節(jié)點,只有一個根節(jié)點
    xmlNewChild
    指定一個節(jié)點,會創(chuàng)建這個節(jié)點的子節(jié)點。這樣不需要使用 xmlNewNode 創(chuàng)建一個節(jié)點,再使用 xmlAddChild 添加到其父節(jié)點中。
    xmlAddChild
    把一個節(jié)點設(shè)置為另外一個節(jié)點的子節(jié)點。
    xmlNewText
    創(chuàng)建一個描述節(jié)點,沒有 <> 符號,需要添加到其他節(jié)點上。比 如上例中的:
    xmlAddChild (pnode1,xmlNewText (BAD_CAST "這是更低的節(jié)點,子子子節(jié)點1"));

    會出現(xiàn)下面的結(jié)果:

    <子子節(jié)點1>這是更低的節(jié)點,子子子節(jié)點1</子子節(jié)點1> xmlNewTextChild
    和 xmlNewText 的區(qū)別如同 xmlNewNodeChild 和 xmlNewNode 的區(qū)別一樣!
    xmlSaveFormatFileEnc
    保存 xml 對象為文件。
    xmlFreeDoc
    釋放 xml 對象
    xmlCleanupParser
    清理
    xmlMemoryDump
    清理

    解析 XML 文檔

    解析一個xml文檔,從中取出想要的信息,例如節(jié)點中包含的文字,或者某個節(jié)點 的屬性,其流程如下:

    • 用 xmlReadFile 函數(shù)讀出一個文檔指針 doc ;
    • 用 xmlDocGetRootElement 函數(shù)得到根節(jié)點 curNode ;
    • curNode->xmlChildrenNode 就是根節(jié)點的子節(jié)點集合 ;
    • 輪詢子節(jié)點集合,找到所需的節(jié)點,用 xmlNodeGetContent 取出其內(nèi)容 ;
    • 用 xmlHasProp 查找含有某個屬性的節(jié)點 ;
    • 取出該節(jié)點的屬性集合,用 xmlGetProp 取出其屬性值 ;
    • 用 xmlFreeDoc 函數(shù)關(guān)閉文檔指針,并清除本文檔中所有節(jié)點動態(tài)申請的內(nèi)存。

    注意: 節(jié)點列表的指針依然是 xmlNodePtr ,屬性列表的指針也是 xmlAttrPtr ,并沒有 xmlNodeList 或者 xmlAttrList 這樣的類型 。看作列表的時候使用它 們的 next 和 prev 鏈表指針來進(jìn)行輪詢 。只有在 Xpath 中有 xmlNodeSet 這 種類型。

    示例

    #include <stdio.h> #include <stdlib.h> #include <libxml/parser.h> #include <libxml/tree.h>int main (int argc , char **argv) {xmlDocPtr pdoc = NULL;xmlNodePtr proot = NULL, curNode = NULL;char *psfilename;if (argc < 1){printf ("用法: %s xml文件名\n", argv[0]);exit (1);}psfilename = argv[1];// 打開 xml 文檔 //xmlKeepBlanksDefault(0); pdoc = xmlReadFile (psfilename, "UTF-8", XML_PARSE_RECOVER);if (pdoc == NULL){printf ("打開文件 %s 出錯!\n", psfilename);exit (1);}// 獲取 xml 文檔對象的根節(jié)對象 proot = xmlDocGetRootElement (pdoc);if (proot == NULL){printf("錯: %s 是空文檔(沒有root節(jié)點)!\n", psfilename);exit (1);}/* 我使用上面程序創(chuàng)建的 xml 文檔,它的根節(jié)點是“根節(jié)點”,這里比較是否正確。*/if (xmlStrcmp (proot->name, BAD_CAST "根節(jié)點") != 0){printf ("錯誤文檔" );exit (1);}/* 如果打開的 xml 對象有 version 屬性,那么就輸出它的值。 */if (xmlHasProp (proot, BAD_CAST "版本")){xmlChar *szAttr = xmlGetProp (proot, BAD_CAST "版本");printf ("版本: %s \n根節(jié)點:%s\n" , szAttr, proot->name);}else{printf (" xml 文檔沒有版本信息\n");}curNode = proot->xmlChildrenNode;char n=0;while (curNode != NULL){if (curNode->name != BAD_CAST "text"){printf ("子節(jié)點%d: %s\n", n++,curNode->name);}curNode = curNode->next;}/* 關(guān)閉和清理 */xmlFreeDoc (pdoc);xmlCleanupParser ();return 0; }

    編譯運行(使用上例創(chuàng)建的 my.xml 文件):

    root@jianlee:~/lab/xml# cat my.xml <?xml version="1.0" encoding="UTF-8"?> <根節(jié)點 版本="1.0"><子節(jié)點1><子子節(jié)點1>信息</子子節(jié)點1><子子節(jié)點1>這是更低的節(jié)點,子子子節(jié)點1</子子節(jié)點1></子節(jié)點1><子節(jié)點2>子節(jié)點2的內(nèi)容</子節(jié)點2><子節(jié)點3>子節(jié)點3的內(nèi)容</子節(jié)點3> </根節(jié)點> root@jianlee:~/lab/xml# gcc -Wall `pkg-config libxml-2.0 --cflags --libs` read_xml.c root@jianlee:~/lab/xml# ./a.out my.xml 版本: 1.0 根節(jié)點:根節(jié)點 子節(jié)點0: text 子節(jié)點1: 子節(jié)點1 子節(jié)點2: text 子節(jié)點3: 子節(jié)點2 子節(jié)點4: text 子節(jié)點5: 子節(jié)點3 子節(jié)點6: text

    為什么 my.xml 文件中顯示只有 ”子節(jié)點1“、 ”子節(jié)點2“和 “子節(jié)點3”三個子節(jié) 點,而程序顯示有 7 個子節(jié)點呢?!而且 0、2、4、6 都是 text 名字?

    這是因為其他四個分別是元素前后的空白文本符號,而 XML 把它們也當(dāng)做一個 Node !元素是 Node 的一種類型。XML 文檔對象模型 (DOM) 定義了幾種不同的 Nodes 類型,包括 Elements(如 files 或者 age)、Attributes(如 units) 和 Text(如 root 或者 10)。元素可以具有子節(jié)點。

    在打開 xml 文檔之前加上一句(取消上面程序中的此句注釋就可以):

    xmlKeepBlanksDefault(0);

    或者使用下面參數(shù)讀取 xml 文檔:

    //讀取xml文件時忽略空格 doc = xmlReadFile(docname, NULL, XML_PARSE_NOBLANKS);

    這樣就可以按我們所想的運行了:

    root@jianlee:~/lab/xml# gcc -Wall `pkg-config libxml-2.0 --cflags --libs` read_xml.c root@jianlee:~/lab/xml# ./a.out my.xml 版本: 1.0 根節(jié)點:根節(jié)點 子節(jié)點0: 子節(jié)點1 子節(jié)點1: 子節(jié)點2 子節(jié)點2: 子節(jié)點3

    還有一點注意: my.xml 文件中的子節(jié)點名字一次是 “子節(jié)點1”、“子節(jié)點2”、 “子節(jié)點3”。程序中的 n 值確是從 0 開始計算。從 0 還是 1 是個人喜好。我有 時候喜好從 0 開始,有時候喜好從 1 開始。

    xmlFreeDoc
    釋放文檔指針。特別注意,當(dāng)你調(diào)用 xmlFreeDoc 時,該文檔所 有包含的節(jié)點內(nèi)存都被釋放,所以一般來說不需要手動調(diào)用 xmlFreeNode 或者 xmlFreeNodeList 來釋放動態(tài)分配的節(jié)點內(nèi)存,除非你把該節(jié)點從文檔中移除 了。一般來說,一個文檔中所有節(jié)點都應(yīng)該動態(tài)分配,然后加入文檔,最后調(diào) 用 xmlFreeDoc 一次釋放所有節(jié)點申請的動態(tài)內(nèi)存,這也是為什么我們很少看 見 xmlNodeFree 的原因。
    xmlSaveFile
    將文檔以默認(rèn)方式存入一個文件。
    xmlSaveFormatFileEnc
    可將文檔以某種編碼/格式存入一個文件中,創(chuàng)建 xml 文檔是的示例中用到

    修改 xml 文檔

    首先打開一個已經(jīng)存在的xml文檔,順著根結(jié)點找到需要添加、刪除、修改的地 方,調(diào)用相應(yīng)的xml函數(shù)對節(jié)點進(jìn)行增、刪、改操作。

    刪除節(jié)點

    刪除節(jié)點使用下面方法:

    if (!xmlStrcmp(curNode->name, BAD_CAST "newNode1")){xmlNodePtr tempNode;tempNode = curNode->next;xmlUnlinkNode(curNode);xmlFreeNode(curNode);curNode = tempNode;continue;}

    即將當(dāng)前節(jié)點從文檔中斷鏈(unlink),這樣本文檔就不會再包含這個子節(jié)點。 這樣做需要使用一個臨時變量來存儲斷鏈節(jié)點的后續(xù)節(jié)點,并記得要手動刪除斷 鏈節(jié)點的內(nèi)存。

    示例

    #include <stdio.h> #include <stdlib.h> #include <libxml/parser.h>int main(int argc, char* argv[]) {xmlDocPtr doc; //定義解析文檔指針 xmlNodePtr curNode; //定義結(jié)點指針(你需要它為了在各個結(jié)點間移動) char *szDocName;if (argc <= 1){printf("Usage: %s docname\n", argv[0]);return(0);}szDocName = argv[1];xmlKeepBlanksDefault(0);doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析文件 if (NULL == doc){fprintf(stderr,"Document not parsed successfully. \n");return -1;}curNode = xmlDocGetRootElement(doc);/*檢查確認(rèn)當(dāng)前文檔中包含內(nèi)容*/if (NULL == curNode){fprintf(stderr,"empty document\n");xmlFreeDoc(doc);return -1;}curNode = curNode->children;while (NULL != curNode){//刪除 "子節(jié)點1" if (!xmlStrcmp(curNode->name, BAD_CAST "子節(jié)點1")){xmlNodePtr tempNode;tempNode = curNode->next;xmlUnlinkNode(curNode);xmlFreeNode(curNode);curNode = tempNode;continue;}//修改 "子節(jié)點2" 的屬性值 if (!xmlStrcmp(curNode->name, BAD_CAST "子節(jié)點2")){xmlSetProp(curNode,BAD_CAST "屬性1", BAD_CAST "設(shè)置");}//修改 “子節(jié)點2” 的內(nèi)容 if (!xmlStrcmp(curNode->name, BAD_CAST "子節(jié)點2")){xmlNodeSetContent(curNode, BAD_CAST "內(nèi)容變了");}//增加一個屬性 if (!xmlStrcmp(curNode->name, BAD_CAST "子節(jié)點3")){xmlNewProp(curNode, BAD_CAST "新屬性", BAD_CAST "有");}//增加 "子節(jié)點4" if (!xmlStrcmp(curNode->name, BAD_CAST "子節(jié)點3")){xmlNewTextChild(curNode, NULL, BAD_CAST "新子子節(jié)點1", BAD_CAST "新內(nèi)容");}curNode = curNode->next;}// 保存文件 xmlSaveFormatFileEnc (szDocName, doc,"UTF-8",1);xmlFreeDoc (doc);xmlCleanupParser ();xmlMemoryDump ();return 0; }

    編譯運行:

    root@jianlee:~/lab/xml# cat my.xml <?xml version="1.0" encoding="UTF-8"?> <根節(jié)點 版本="1.0"><子節(jié)點1><子子節(jié)點1>信息</子子節(jié)點1><子子節(jié)點1>這是更低的節(jié)點,子子子節(jié)點1</子子節(jié)點1></子節(jié)點1><子節(jié)點2>子節(jié)點2的內(nèi)容</子節(jié)點2><子節(jié)點3>子節(jié)點3的內(nèi)容</子節(jié)點3> </根節(jié)點> root@jianlee:~/lab/xml# gcc -Wall `pkg-config libxml-2.0 --cflags --libs` modify_xml.c root@jianlee:~/lab/xml# ./a.out my.xml root@jianlee:~/lab/xml# cat my.xml <?xml version="1.0" encoding="UTF-8"?> <根節(jié)點 版本="1.0"><子節(jié)點2 屬性1="設(shè)置">內(nèi)容變了</子節(jié)點2><子節(jié)點3 新屬性="有">子節(jié)點3的內(nèi)容<新子子節(jié)點1>新內(nèi)容</新子子節(jié)點1></子節(jié)點3> </根節(jié)點> root@jianlee:~/lab/xml# ./a.out my.xml # 看看再運行一次的結(jié)果! root@jianlee:~/lab/xml# cat my.xml <?xml version="1.0" encoding="UTF-8"?> <根節(jié)點 版本="1.0"><子節(jié)點2 屬性1="設(shè)置">內(nèi)容變了</子節(jié)點2><子節(jié)點3 新屬性="有" 新屬性="有">子節(jié)點3的內(nèi)容<新子子節(jié)點1>新內(nèi)容</新子子節(jié)點1><新子子節(jié)點1>新內(nèi)容</新子子節(jié)點1></子節(jié)點3> </根節(jié)點>

    Xpath — 處理大型 XML 文檔

    libxml2 庫函數(shù)

    要注意的函數(shù)

    xmlKeepBlanksDefault

    int xmlKeepBlanksDefault (int val)

    設(shè)置是否忽略空白節(jié)點,比如空格,在分析前必須調(diào)用,默認(rèn)值是0,最好設(shè)置成1.

    xmlKeepBlanksDefault(0) 除了在讀入xml文件時忽略空白之外,還會在寫出xml 文件時在每行前面放置縮進(jìn)(indent)。如果使用xmlKeepBlanksDefault(1) 則 你會發(fā)現(xiàn)每行前面的縮進(jìn)就沒有了,但不會影響回車換行。

    xmlSaveFormatFile

    // 保存 xml 為文件,如果沒有給出文件名參數(shù),就輸出到標(biāo)準(zhǔn)輸出xmlSaveFormatFileEnc (argc > 1 ? argv[1]:"-", pdoc, "UTF-8", 1);

    xmlSaveFormatFile 的 format 參數(shù)設(shè)置成 0,保存后的 xml 文檔里是會把所有 的結(jié)點都放到一行里顯示。設(shè)置為 1,就可以自動添加回車。

    讀取 xml 文件

    xmlParseFile

    xmlDocPtr xmlParseFile (const char * filename)

    以默認(rèn)方式讀入一個 UTF-8 格式的 xml 文檔, 并返回一個文檔對象指針 <libxml/tree.h>

    xmlReadFile

    指定編碼讀取一個 xml 文檔,返回指針。

    xml 操作基本結(jié)構(gòu)及其指針類型

    xmlDoc, xmlDocPtr

    文檔對象的結(jié)構(gòu)體及其指針

    xmlNode, xmlNodePtr

    節(jié)點對象的結(jié)構(gòu)體及其指針

    xmlAttr, xmlAttrPtr

    節(jié)點屬性的結(jié)構(gòu)體及其指針

    xmlNs, xmlNsPtr

    節(jié)點命名空間的結(jié)構(gòu)及其指針

    根節(jié)點相關(guān)函數(shù)

    xmlDocGetRootElement

    xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc) 獲取文檔根節(jié)點

    xmlDocSetRootElement

    xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root) 設(shè)置文檔根節(jié)點

    創(chuàng)建子節(jié)點相關(guān)函數(shù)

    xmlNewNode

    xmlNodePtr xmlNewNode (xmlNsPtr ns, const xmlChar * name) 創(chuàng)建新節(jié)點

    xmlNewChild

    xmlNodePtr xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar * name, const xmlChar * content) 創(chuàng)建新的子節(jié)點

    xmlCopyNode

    xmlNodePtr xmlCopyNode (const xmlNodePtr node, int extended) 復(fù)制當(dāng)前節(jié)點

    添加子節(jié)點相關(guān)函數(shù)

    xmlAddChild

    xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) 給指定節(jié)點添加子節(jié)點

    xmlAddNextSibling

    xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) 添加后一個兄弟節(jié)點

    xmlAddPrevSibling

    xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) 添加前一個兄弟節(jié)點

    xmlAddSibling

    xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) 添加兄弟節(jié)點

    屬性相關(guān)函數(shù)

    xmlNewProp

    xmlAttrPtr xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) 創(chuàng)建新節(jié)點屬性

    xmlGetProp

    xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name) 讀取節(jié)點屬性

    xmlSetProp

    xmlAttrPtr xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) 設(shè)置節(jié)點屬性

    總結(jié)

    以上是生活随笔為你收集整理的libxml -- 解析 XML 文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。