青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 60, 文章 - 0, 評論 - 197, 引用 - 0
數據加載中……

用libxml 解析XML (一)

Libxml 是一個實現讀、創建及操縱XML數據功能的C語言庫。這個指南提供例子代碼并給出它基本功能的解釋。在這個項目的主頁上有Libxml及更多關于它可用的資料。包含有完整的API文檔。這個指南并不能替代這些完整的文檔,但是闡明功能需要使用庫來完成基本操作。


本指南中的例子代碼示范如何做到:
解析文檔
取得指定元素的文本
添加一個元素及它的內容
添加一個屬性
取得一個屬性的值
例子的完整代碼包含在附錄中
 
數據類型
Libxml
定義了許多數據類型,我們將反復碰到它們,它隱藏了雜亂的來源以致你不必處理它除非你有特定的需要。xmlChar  替代char,使用UTF-8編碼的一字節字符串。如果你的數據使用其它編碼,它必須被轉換到UTF-8才能使用libxml的函數。在libxml編碼支持WEB頁面有更多關于編碼的有用信息。
XmlDoc
包含由解析文檔建立的樹結構,xmlDocPtr是指向這個結構的指針。
xmlNodePtr and xmlNode
包含單一結點的結構xmlNodePtr是指向這個結構的指針,它被用于遍歷文檔樹。
 
解析文檔
解析文檔時僅僅需要文件名并只調用一個函數,并有錯誤檢查。完整代碼:附錄C, Keyword例程代碼
 
xmlDocPtr doc;
xmlNodePtr cur;
doc = xmlParseFile(docname);
if (doc == NULL ) {
    fprintf(stderr,"Document not parsed successfully. \n");
    return;
}
cur = xmlDocGetRootElement(doc);
if (cur == NULL) {
    fprintf(stderr,"empty document\n");
    xmlFreeDoc(doc);
    return;
}
if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
    fprintf(stderr,"document of the wrong type, root node != story");
    xmlFreeDoc(doc);
    return;
}
定義解析文檔指針。
定義結點指針(你需要它為了在各個結點間移動)
檢查解析文檔是否成功,如果不成功,libxml將指一個注冊的錯誤并停止。
 
注釋
一個常見錯誤是不適當的編碼。XML標準文檔除了用UTF-8UTF-16外還可用其它編碼保存。如果文檔是這樣,libxml將自動地為你轉換到UTF-8。更多關于XML編碼信息包含在XML標準中。
取得文檔根元素
檢查確認當前文檔中包含內容。
在這個例子中,我們需要確認文檔是正確的類型。“Story”是在這個指南中使用文檔的根類型。
 
取得元素內容
 
你找到在文檔樹中你要查找的元素后可以取得它的內容。在這個例子中我們查找“story”元素。進程將在冗長的樹中查找我們感興趣的元素。我們假定期你已經有了一個名為docxmlDocPtr和一個名為curxmlNodPtr
cur = cur->xmlChildrenNode;
while (cur != NULL) {  
    if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
        parseStory (doc, cur);
    }
    cur = cur->next;
}
 
取得cur的第一個子結點,cur指向文檔的根,即“story”元素。
這個循環迭代通過“story”的子元素查找“storyinfo”。這是一個包含有我們將查找的“keywords”的元素。它使用了libxml字符串比較函數xmlStrcmp。如果相符,它調用函數parseStory
 
void parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
        if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
        key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
              printf("keyword: %s\n", key);
              xmlFree(key);
        }
        cur = cur->next;
    }
    return;
}
再次取得第一個子結點。
像上面那個循環一樣,我們能過迭代,查找我們感興趣的叫做“keyword”的元素。
當我們找到元素“keyword時,我們需要打印它包含在XML中的記錄的內容,文本被包含于元素的子結點中,因此我們借助了cur-> xmlChildrenNode,為了取得文本,我們使用函數xmlNodeListGetString,它有一個文檔指針參數,在這個例子中,我們僅僅打印它。
注釋
因為xmlNodeListGetString為它返回的字符串分配內存,你必須使用xmlFree釋放它。
 
使用XPath取得元素內容
除了一步步遍歷文檔樹查找元素外,Libxml2包含支持使用Xpath表達式取得指定結點集。完整的Xpath API文檔在這里。Xpath允許通過路徑文檔搜索匹配指定條件的結點。在下面的例子中,我們搜索文檔中所有的“keyword”元素。 
 
注釋
下面是Xpath完整的討論。它詳細的使用資料,請查閱Xpath規范。
這個例子完整的代碼參見附錄DXPath例程代碼。
Using XPath requires setting up an xmlXPathContext and then supplying the XPath expression and the context to the xmlXPathEvalExpression

function.
The function returns an xmlXPathObjectPtr, which includes the set of nodes satisfying the XPath expression.
使用XPath需要安裝xmlXPathContext才支持XPath表達式及xmlXPathEvalExpression函數,這個函數返回一個xmlXPathObjectPtr,它包含有

XPath表達式的結點集。
 
xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
xmlXPathContextPtr context;
   xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
result = xmlXPathEvalExpression(xpath, context);
if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
       printf("No result\n");
       return NULL;
   }
   xmlXPathFreeContext(context);
   return result;
}
首先定義變量
初始化變量context
應用XPath表達式
檢查結果
由函數返回的xmlPathObjectPtr包含一個結點集和其它需要被迭代及操作的信息。在這個例子中我們的函數返回 xmlXPathObjectPtr,我們使用它打印我們文檔中keyword結點的內容。這個結點集對象包含在集合(nodeNr)中的元素數目及一個結點(nodeTab)數組。
 
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(doc,
   nodeset->nodeTab[i]->xmlChildrenNode, printf("keyword: %s\n", keyword);
   xmlFree(keyword);
}
變量nodeset->Nr持有結點集中元素的數量。我們使用它遍歷數組。
打印每個結點包含的內容。
注釋
Note that we are printing the child node of the node that is returned, because the contents of the keyword element are a child text node.
注意我們打印的是結點的子結點的返回值,因為keyword元素的內容是一個子文本結點。


寫元素
寫元素內容使用上面許多一樣的步驟解析文檔并遍歷樹。我們先解析文檔然后遍歷樹查找我們想插入元素的位置。在這個例子中,我們再一次查找“storyinfo

元素并插入一個keyword。然后我們裝文件寫入磁盤。完整代碼:附錄E,添加keyword例程
本例中主要的不同在于parseStory
void
parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
xmlNewTextChild (cur, NULL, "keyword", keyword);
   return;
}
XmlNewTextChild函數添加一個當前結點的新的子元素到樹中
一旦結點被添加,我們應當寫文檔到文件中。你是否想給元素指定一個命名空間?你能添加它,在我們的例子中,命名空間是NULL
 
xmlSaveFormatFile (docname, doc, 1);
 
第一個參數是寫入文件的名,你注意到和我們剛剛讀入的文件名是一樣的。在這個例子中,我們僅僅覆蓋原來的文件。第二個參數是一個xmlDoc結構指針,第三個參數設定為1,保證在輸出上寫入。

posted on 2007-08-27 17:32 Normandy 閱讀(3668) 評論(3)  編輯 收藏 引用 所屬分類: XML

評論

# re: 用libxml 解析XML (一)  回復  更多評論   

<?xml version="1.0" standalone="yes" ?>
<!--
Tests support of XML, XMLNS, and UTF-8. To pass, the user agent must load pass.html.
-->
<!DOCTYPE widget [
<!ENTITY widgets-ns "http://www.w3.org/ns/widgets">
<!ENTITY pass "pass&amp;.html">
]>
<xyz:widget xmlnsyz="&widgets-ns;">
<xyz:content src="&pass;"/>
<xyz:name>bv</xyz:name>
</xyz:widget>

我第一次接觸libxml2, 調試了很長時間也沒有頭緒,請幫忙看看,謝謝了。

代碼是這樣的,
xmlDoc *xmldoc = xmlParseFile(filename);
會crash,
2010-08-05 15:35 | talking1239

# re: 用libxml 解析XML (一)  回復  更多評論   

可否幫忙看下這個問題, 解析下面的xml,會crash。
<?xml version="1.0" standalone="yes" ?>
<!--
Tests support of XML, XMLNS, and UTF-8. To pass, the user agent must load pass.html.
-->
<!DOCTYPE widget [
<!ENTITY widgets-ns "http://www.w3.org/ns/widgets">
<!ENTITY pass "pass&amp;.html">
]>
<xyz:widget xmlnsyz="&widgets-ns;">
<xyz:content src="&pass;"/>
<xyz:name>bv</xyz:name>
</xyz:widget>

我第一次接觸libxml2, 調試很長時間也沒有頭緒,請幫忙看看,謝謝了。

xmlDoc *xmldoc = xmlParseFile(filename);
會crash,
2010-08-05 15:36 | talking1239

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情一区二区三区成人| 免费久久99精品国产自| 国产精品一区二区女厕厕| 欧美日韩不卡视频| 欧美午夜片在线观看| 国产精品一区免费观看| 国产一区日韩二区欧美三区| 黄色在线一区| 亚洲三级免费观看| 亚洲一级高清| 久久一区二区精品| 精品动漫3d一区二区三区| 国产精品一区二区久久久| 国产一区二区精品| 亚洲精品免费网站| 亚洲图片在线观看| 久久久久久久久伊人| 最近中文字幕日韩精品| 亚洲精品乱码视频| 性xx色xx综合久久久xx| 猛干欧美女孩| 国产精品美女久久久久久免费| 国产专区精品视频| 亚洲视频第一页| 蜜桃久久av一区| 亚洲一二区在线| 麻豆成人在线播放| 国产精品久久久久毛片软件 | 亚洲精品乱码视频| 午夜欧美精品| 亚洲国产欧美在线人成| 性18欧美另类| 国产精品扒开腿做爽爽爽视频| 精品二区久久| 欧美制服丝袜第一页| 最近中文字幕日韩精品 | 欧美~级网站不卡| 国产日韩欧美日韩| 亚洲一级高清| 日韩视频在线免费| 久久人体大胆视频| 国产午夜亚洲精品羞羞网站| 一区二区三区四区五区视频 | 欧美激情久久久久| 久久国产主播| 国产亚洲激情在线| 午夜精品久久久久久久男人的天堂| 亚洲第一福利视频| 久久精品免费观看| 国产日韩欧美夫妻视频在线观看| 亚洲综合另类| av成人免费观看| 欧美日韩国产一区精品一区| 亚洲激精日韩激精欧美精品| 老鸭窝亚洲一区二区三区| 欧美一级精品大片| 国产一区二区三区精品欧美日韩一区二区三区 | 久久久久.com| 国产亚洲激情| 久久在线观看视频| 久久精品一区二区三区不卡牛牛| 亚洲欧美视频一区二区三区| 欧美性视频网站| 亚洲天堂av在线免费| 亚洲人久久久| 欧美日韩亚洲综合一区| 中文av字幕一区| 宅男66日本亚洲欧美视频| 国产精品yjizz| 亚洲欧美影音先锋| 小嫩嫩精品导航| 亚洲国产福利在线| 亚洲破处大片| 国产精品99一区二区| 欧美一区二区啪啪| 久久久青草青青国产亚洲免观| 激情欧美国产欧美| 亚洲国产日韩欧美| 欧美少妇一区| 久久久精品性| 欧美成熟视频| 午夜欧美精品| 美女精品网站| 亚洲免费小视频| 久久久久久久国产| 中文国产一区| 久久精品成人一区二区三区 | 国产精品久久久久久久久免费樱桃 | 国产精品99久久久久久www| 国产日韩亚洲欧美精品| 欧美成人激情视频免费观看| 欧美伦理一区二区| 欧美呦呦网站| 欧美激情小视频| 久久久av毛片精品| 欧美国产亚洲精品久久久8v| 欧美亚洲免费| 欧美激情一区二区三区成人 | 99国产精品视频免费观看一公开| 99在线观看免费视频精品观看| 国产亚洲综合性久久久影院| 亚洲精品1区2区| 国产在线精品成人一区二区三区| 亚洲国产高清在线| 国产日韩欧美高清| 一区二区福利| 亚洲肉体裸体xxxx137| 羞羞色国产精品| 一区二区日本视频| 老妇喷水一区二区三区| 亚洲欧美三级伦理| 欧美激情第8页| 免费精品99久久国产综合精品| 国产伦精品一区二区三区免费 | 亚洲综合成人婷婷小说| 亚洲国产精品第一区二区三区| 亚洲视频在线视频| 亚洲免费成人| 另类天堂av| 久久米奇亚洲| 国产啪精品视频| 99这里只有精品| 亚洲免费观看高清在线观看| 久久久之久亚州精品露出| 欧美在线视频播放| 国产精品亚发布| 亚洲午夜电影网| 亚洲一区视频在线| 欧美日韩免费观看一区=区三区| 欧美99在线视频观看| 国产真实精品久久二三区| 亚洲欧洲av一区二区三区久久| 亚洲一区二区三区在线观看视频 | 亚洲国产精品黑人久久久| 久久xxxx| 老司机精品导航| 国产自产精品| 久久久久国产精品www| 久久野战av| 在线看日韩av| 久热国产精品| 亚洲丶国产丶欧美一区二区三区| 在线免费观看成人网| 久久影院亚洲| 亚洲国产精品高清久久久| 亚洲激情综合| 欧美日韩成人综合在线一区二区 | 一区二区三区四区蜜桃| 欧美人与性动交cc0o| 一区二区三区精品国产| 西瓜成人精品人成网站| 国产美女精品| 久久久久久国产精品一区| 欧美韩国日本一区| 亚洲美女中出| 国产精品欧美久久| 欧美自拍偷拍午夜视频| 欧美+亚洲+精品+三区| 亚洲精品资源| 国产精品第一区| 久久九九热免费视频| 亚洲成在线观看| 亚洲主播在线| 伊人天天综合| 欧美日韩一区不卡| 欧美在线999| 亚洲理伦在线| 久久久久中文| 亚洲素人在线| 在线播放视频一区| 欧美日韩国产欧| 久久精彩免费视频| 99视频精品免费观看| 久久免费精品日本久久中文字幕| 亚洲国产精品传媒在线观看| 国产精品国产三级国产专播品爱网 | 久久精品一区四区| 亚洲精品日韩一| 国产日产亚洲精品| 欧美精品午夜视频| 欧美中日韩免费视频| 亚洲人午夜精品| 久久久久网址| 午夜日本精品| 一区二区三区免费观看| 一区二区三区在线看| 欧美亚洲成人免费| 欧美高清在线一区二区| 久久国产精品久久久久久| 一本色道久久综合亚洲精品不 | 国产精品丝袜白浆摸在线| 女人香蕉久久**毛片精品| 午夜精品久久久| 99天天综合性| 亚洲精品国产视频| 欧美成人免费小视频| 久久人人爽人人爽爽久久| 亚洲综合导航| 一本色道久久88亚洲综合88| 亚洲欧洲精品一区二区|