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

隨筆 - 60, 文章 - 0, 評論 - 197, 引用 - 0
數(shù)據(jù)加載中……

用libxml 解析XML (一)

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


本指南中的例子代碼示范如何做到:
解析文檔
取得指定元素的文本
添加一個元素及它的內容
添加一個屬性
取得一個屬性的值
例子的完整代碼包含在附錄中
 
數(shù)據(jù)類型
Libxml
定義了許多數(shù)據(jù)類型,我們將反復碰到它們,它隱藏了雜亂的來源以致你不必處理它除非你有特定的需要。xmlChar  替代char,使用UTF-8編碼的一字節(jié)字符串。如果你的數(shù)據(jù)使用其它編碼,它必須被轉換到UTF-8才能使用libxml的函數(shù)。在libxml編碼支持WEB頁面有更多關于編碼的有用信息。
XmlDoc
包含由解析文檔建立的樹結構,xmlDocPtr是指向這個結構的指針。
xmlNodePtr and xmlNode
包含單一結點的結構xmlNodePtr是指向這個結構的指針,它被用于遍歷文檔樹。
 
解析文檔
解析文檔時僅僅需要文件名并只調用一個函數(shù),并有錯誤檢查。完整代碼:附錄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將指一個注冊的錯誤并停止。
 
注釋
一個常見錯誤是不適當?shù)木幋a。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”元素。
這個循環(huán)迭代通過“story”的子元素查找“storyinfo”。這是一個包含有我們將查找的“keywords”的元素。它使用了libxml字符串比較函數(shù)xmlStrcmp。如果相符,它調用函數(shù)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;
}
再次取得第一個子結點。
像上面那個循環(huán)一樣,我們能過迭代,查找我們感興趣的叫做“keyword”的元素。
當我們找到元素“keyword時,我們需要打印它包含在XML中的記錄的內容,文本被包含于元素的子結點中,因此我們借助了cur-> xmlChildrenNode,為了取得文本,我們使用函數(shù)xmlNodeListGetString,它有一個文檔指針參數(shù),在這個例子中,我們僅僅打印它。
注釋
因為xmlNodeListGetString為它返回的字符串分配內存,你必須使用xmlFree釋放它。
 
使用XPath取得元素內容
除了一步步遍歷文檔樹查找元素外,Libxml2包含支持使用Xpath表達式取得指定結點集。完整的Xpath API文檔在這里。Xpath允許通過路徑文檔搜索匹配指定條件的結點。在下面的例子中,我們搜索文檔中所有的“keyword”元素。 
 
注釋
下面是Xpath完整的討論。它詳細的使用資料,請查閱Xpath規(guī)范。
這個例子完整的代碼參見附錄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函數(shù),這個函數(shù)返回一個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表達式
檢查結果
由函數(shù)返回的xmlPathObjectPtr包含一個結點集和其它需要被迭代及操作的信息。在這個例子中我們的函數(shù)返回 xmlXPathObjectPtr,我們使用它打印我們文檔中keyword結點的內容。這個結點集對象包含在集合(nodeNr)中的元素數(shù)目及一個結點(nodeTab)數(shù)組。
 
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(doc,
   nodeset->nodeTab[i]->xmlChildrenNode, printf("keyword: %s\n", keyword);
   xmlFree(keyword);
}
變量nodeset->Nr持有結點集中元素的數(shù)量。我們使用它遍歷數(shù)組。
打印每個結點包含的內容。
注釋
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函數(shù)添加一個當前結點的新的子元素到樹中
一旦結點被添加,我們應當寫文檔到文件中。你是否想給元素指定一個命名空間?你能添加它,在我們的例子中,命名空間是NULL
 
xmlSaveFormatFile (docname, doc, 1);
 
第一個參數(shù)是寫入文件的名,你注意到和我們剛剛讀入的文件名是一樣的。在這個例子中,我們僅僅覆蓋原來的文件。第二個參數(shù)是一個xmlDoc結構指針,第三個參數(shù)設定為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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   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香蕉国产精品偷在线观看| 母乳一区在线观看| 国产欧美日韩精品专区| 欧美视频一区二区在线观看| 国产精品国产三级欧美二区| 国产精品户外野外| 国产精品毛片一区二区三区 | 欧美日韩免费在线视频| 欧美日韩视频在线第一区| 国产精品久久久久久福利一牛影视 | 在线观看中文字幕不卡| 亚洲人成在线观看| 亚洲欧美日韩视频一区| 免费观看久久久4p| 宅男精品导航| 久久综合色88| 国产精品区一区二区三区| 国语精品一区| 一区二区三区不卡视频在线观看| 香蕉久久夜色精品国产使用方法| 美女性感视频久久久| 99视频精品全部免费在线| 久久精品人人做人人综合| 欧美日韩精品在线| 怡红院av一区二区三区| 亚洲欧美日韩一区二区| 亚洲国产精品国自产拍av秋霞| 亚洲精品一品区二品区三品区| 欧美在线亚洲综合一区| 欧美亚州一区二区三区| 亚洲第一天堂无码专区| 午夜精品网站| 亚洲人成在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品vip| 亚洲精品黄色| 美女成人午夜| 欧美影院久久久| 国产精品高精视频免费| 亚洲电影在线看| 久久精品一区二区| 亚洲一区二区三区精品视频 | 国产欧美日韩在线观看| 日韩一级裸体免费视频| 免费欧美电影| 久久久久国产一区二区| 国产一区二区三区的电影 | 亚洲欧美日韩精品久久奇米色影视 | 国产欧美激情| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲一区亚洲| 欧美日韩亚洲系列| 日韩一级黄色大片| 亚洲欧洲日产国产网站| 欧美第一黄色网| 亚洲人被黑人高潮完整版| 欧美成人午夜免费视在线看片| 久久国产欧美| 在线精品国产成人综合| 老司机午夜精品视频| 欧美一区视频在线| 国产一区二区三区久久悠悠色av| 久久xxxx| 久久久久久日产精品| 亚洲第一狼人社区| 欧美国产日产韩国视频| 美女尤物久久精品| 亚洲精品国产无天堂网2021| 亚洲区国产区| 国产精品久久国产精品99gif| 亚洲一区欧美二区| 亚洲视频每日更新| 国产日韩欧美不卡| 麻豆精品精华液| 欧美成人黑人xx视频免费观看 | 久久精品国产欧美亚洲人人爽| 亚洲欧美日韩国产综合在线| 国产视频一区二区在线观看| 久久婷婷成人综合色| 美女精品在线观看| 一本色道久久综合亚洲精品不卡 | 欧美激情小视频| 亚洲午夜在线| 欧美一区二区三区在线看| 亚洲国产日韩欧美在线99| 亚洲日本电影| 国产日韩欧美日韩大片| 欧美黑人一区二区三区| 欧美视频久久| 欧美成人免费在线观看| 国产精品另类一区| 欧美1区免费| 国产精品美女www爽爽爽| 每日更新成人在线视频| 欧美色另类天堂2015| 老色鬼精品视频在线观看播放| 欧美日韩国产成人在线91| 久久免费精品日本久久中文字幕| 欧美精品久久久久久久| 久久久五月婷婷| 欧美日韩国产大片| 久久久爽爽爽美女图片| 国产精品久久激情| 欧美一区二区三区视频在线观看 | 国产亚洲精品bt天堂精选| 欧美激情第4页| 国产精品一区免费视频| 91久久精品一区二区别| 激情亚洲网站| 亚洲欧美在线播放| 这里只有精品视频| 久久综合999| 久久久久久久高潮| 国产精品二区在线| 亚洲人成在线影院| 狠狠色2019综合网| 性xx色xx综合久久久xx| 亚洲午夜精品在线| 麻豆av一区二区三区| 久久婷婷久久一区二区三区| 国产精品青草久久| 一区二区高清| 亚洲网站在线观看| 欧美日韩一区在线观看| 亚洲日本成人网| 亚洲经典一区| 久久亚洲综合网| 久久夜色精品国产噜噜av| 国产亚洲视频在线| 午夜天堂精品久久久久| 午夜视频在线观看一区二区三区| 欧美日韩综合另类| 在线亚洲精品| 欧美一区二区免费观在线| 国产精品一区二区三区四区| 亚洲砖区区免费| 久久av二区| 国产在线精品自拍| 久久免费视频这里只有精品| 麻豆freexxxx性91精品| 激情成人av| 久久综合狠狠综合久久综合88| 美女福利精品视频| 亚洲人成亚洲人成在线观看图片 | 亚洲国产精品传媒在线观看| 久久综合伊人77777| 欧美激情精品久久久| 亚洲黄色免费| 欧美日韩精品一本二本三本| 9国产精品视频| 亚洲无线视频| 国产日韩欧美综合在线| 久久精品日产第一区二区| 欧美gay视频激情| 亚洲伦理一区| 国产精品日韩欧美大师| 久久蜜桃资源一区二区老牛| 欧美国产在线视频| 中文精品视频| 国产日韩欧美一区二区| 久久亚洲精品一区| 日韩午夜电影av| 久久国产精品亚洲77777| 亚洲国产成人久久综合| 欧美日韩一区免费| 久久爱www久久做| 亚洲人成高清| 久久久精品日韩欧美| 亚洲精品一区二区三区福利| 中文在线不卡| 亚洲第一黄色| 国产精品国内视频| 久久婷婷一区| 亚洲一级影院| 亚洲高清视频在线| 欧美一级在线播放| 亚洲精品国产精品国自产在线| 国产精品一区二区黑丝| 欧美成人一区在线| 亚洲欧美电影院| 亚洲国产精品美女| 久久久国产精品一区| 亚洲一区二区动漫| 亚洲国产日本| 国精产品99永久一区一区| 欧美日韩123| 久久躁日日躁aaaaxxxx| 亚洲欧美综合网| 99ri日韩精品视频| 欧美ab在线视频| 久久精品欧美| 亚洲欧美在线免费观看| 99成人精品| 亚洲国内精品在线| 国外成人性视频| 国产一区二区成人| 国产精品福利片| 欧美激情亚洲自拍| 男同欧美伦乱| 免费看的黄色欧美网站|