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

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

用libxml 解析XML (二)

寫屬性
寫屬性類似于給一個新元素寫文本。在這個例子中,我們將添加一個reference結點URI屬性到我們的文檔中。完整代碼:附錄F,添加屬性例程代碼。 referencestory元素的一個子結點,所以找到并插入新元素及其屬性是簡單的。一旦我們在parseDoc進行了錯誤檢查,我們將在正確的位置加放我們的新元素。但進行之前我們需要定義一個此前我們不見過的數據類型。
 
xmlAttrPtr newattr;
 
我們也需要xmlNodePtr
 
xmlNodePtr newnode;
 
剩下的parseDoc則和前面一樣,檢查根結點是否為story。如果是的,那我們知道我們將在指定的位置添加我們的元素。  
newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
newattr = xmlNewProp (newnode, "uri", uri);
 
使用xmlNewTextChild函數添國一個新結點到當前結點位置。
一旦結點被添加,文件應像前面的例子將我們添加的元素及文本內容寫入磁盤。
 
取得屬性
取得屬性值類似于前面我們取得一個結點的文本內容。在這個例子中,我們將取出我們在前一部分添加的URI的值。完整代碼:附錄G,取得屬性值例程代碼。


  
這個例子的初始步驟和前面是類似的:解析文檔,查找你感興趣的元素,然后進入一個函數完成指定的請求任務。在這個例子中,我們調用getReference。
 
void
getReference (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *uri;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
uri = xmlGetProp(cur, "uri");
    printf("uri: %s\n", uri);
    xmlFree(uri);
}
cur = cur->next;
}
return;
}
 
 關鍵函數是xmlGetProp,它返回一個包含屬性值的xmlChar。在本例中,我們僅僅打印它。
 
注釋
如果你使用DTD定義屬性的固定值或缺省值,這個函數也將取得它。
 
編碼轉換
數據編碼兼容問題是程序員新建普通的XML或特定XML時最常見的困難。按照這里

   稍后的討論來思考設計你的應用程序將幫助你避免這個困難。實際上,libxml能以UTF-8格式保存和操縱多種數據 
你的程序使用其它的數據格式,比如常見的ISO-8859-1編碼,必須使用libxml函數轉換到UTF-8。如果你想你的程序以除UTF-8外的其它編碼方式輸出也必須做轉換。 
   
如果能有效地轉換數據Libxml將使用轉換器。無轉換器時,僅僅UTF-8、UTF-16ISO-8859-1能夠被作為外部格式使用。有轉換器時,它能將從其它格式與UTF-8互換的任何格式均可使用。當前轉換器支持大約150種不同的編碼格式之間的相互轉換。實際支持的格式數量正在被實現。每一個實現在的轉換器盡可能的支持每一種格式。
 
警告
一個常見錯誤是在內部數據不同的部分使用不同的編碼格式。最常見的是情況是一個應用以ISO-8859-1作為內部數據格式,結合libxml部分使用UTF-8格式。結果是一個應用程序要面對不同地內部數據格式。一部分代碼執行后,它或其它部分代碼將使用曲解的數據。
  
這個例子構造一個簡單的文檔,然后添加在命令行提供的內容到根元素并使用適當的編碼將結果輸出到標準輸出設備上。在這個例子中,我們使用ISO-8859 -1編碼。在命令輸入的內容將被從ISO-8859-1轉換到UTF-8。完整代碼:附件H,編碼轉換例程代碼。
 
  
包含在例子中的轉換函數使用libxmlxmlFindCharEncodingHandler函數。
 
xmlCharEncodingHandlerPtr handler;
size = (int)strlen(in)+1;
out_size = size*2-1;
out = malloc((size_t)out_size);

handler = xmlFindCharEncodingHandler(encoding);

handler->input(out, &out_size, in, &temp);

xmlSaveFormatFileEnc("-", doc, encoding, 1);
 
定義一個xmlCharEncodingHandler函數指針。
XmlCharEncodingHandler函數需要給出輸入和輸出字符串的大小,這里計算輸入輸出字符串。
XmlFindCharEncodingHandler使用數據初始編碼作為參數搜索libxml已經完成的轉換器句柄并將找到的函數指針返回,如果沒有找到則返回NULL。
The conversion function identified by handler requires as its arguments pointers to the input and output strings, along with the length of each. The lengths must be determined separately by the application.
由句柄指定的轉換函數請求輸入、輸出字符中及它們的長度作為參數。這個長度必須由應用程序分別指定。
用指定編碼而不是UTF-8輸出,我們使用xmlSaveFormatFileEnc指不定期編碼方式。 
 
A.
編譯
Libxml
包含一個腳本xml2-config,它一般用于編譯和鏈接程序到庫時產生標志。

 為了取得預處理和編譯標志,使用xml2-config –cflags,為了取得鏈接標志,使用xml2-config –libs。其它有效的參數請使用xml2-config –help查閱。
 
B.
示例文檔
<?xml version="1.0"?>
<story>
  <storyinfo>
    <author>John Fleck</author>
    <datewritten>June 2, 2002</datewritten>
    <keyword>example keyword</keyword>
  </storyinfo>
  <body>
    <headline>This is the headline</headline>
    <para>This is the body text.</para>
  </body>
</story>


C. Keyword例程代碼
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

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;
}


static void
parseDoc(char *docname) {
  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;
  }
  cur = cur->xmlChildrenNode;
  while (cur != NULL) {
    if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
      parseStory (doc, cur);
    }
    cur = cur->next;
  }
  xmlFreeDoc(doc);
  return;
}


int
main(int argc, char **argv) {
  char *docname;
  if (argc <= 1) {
    printf("Usage: %s docname\n", argv[0]);
    return(0);
  }
  docname = argv[1];
  parseDoc (docname);
  return (1);
}

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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黑人| 欧美日韩在线三级| 99热这里只有精品8| 亚洲国产另类 国产精品国产免费| 亚洲欧美电影在线观看| 国产精品青草久久久久福利99| 中日韩午夜理伦电影免费| 欧美国产日韩一区| 久久综合久色欧美综合狠狠| 在线成人www免费观看视频| 久久久久国产精品www| 亚洲在线免费视频| 国产精品丝袜xxxxxxx| 校园激情久久| 亚洲欧洲av一区二区| 韩国精品在线观看| 美女亚洲精品| 欧美岛国激情| 亚洲午夜av电影| 一区二区三区视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 另类春色校园亚洲| 亚洲级视频在线观看免费1级| 亚洲国产日本| 欧美日韩国产高清| 亚洲欧美激情精品一区二区| 亚洲欧美日韩国产| 在线观看国产精品淫| 亚洲第一天堂av| 欧美精品三级| 欧美一级大片在线免费观看| 欧美在线一二三| 91久久国产自产拍夜夜嗨| 亚洲欧洲日韩在线| 国产精品久久久久久亚洲毛片| 久久精品国产亚洲aⅴ| 麻豆av福利av久久av| 日韩一级视频免费观看在线| 亚洲视频网在线直播| 国产一区二区三区成人欧美日韩在线观看 | 欧美一区二区大片| 在线免费观看成人网| 日韩视频免费| 国产真实久久| 亚洲精品久久视频| 国产免费一区二区三区香蕉精| 欧美va亚洲va国产综合| 欧美午夜视频网站| 久久综合中文色婷婷| 欧美三级小说| 欧美国产日韩视频| 国产精品女人网站| 亚洲高清网站| 黄色精品在线看| 日韩亚洲欧美精品| 雨宫琴音一区二区在线| 一本一本久久a久久精品牛牛影视| 国语自产精品视频在线看8查询8 | 欧美91视频| 性做久久久久久久免费看| 免费成人黄色| 久久婷婷蜜乳一本欲蜜臀| 欧美视频不卡| 亚洲第一区在线观看| 国产揄拍国内精品对白| 99精品欧美一区二区三区| 亚洲国产成人91精品| 亚洲女爱视频在线| 一区二区三区四区在线| 男女视频一区二区| 久久人体大胆视频| 国产精品夜夜夜| 日韩午夜激情| 亚洲人成在线播放| 久久久之久亚州精品露出| 欧美一区二区三区在| 欧美日韩国产成人精品| 欧美激情第4页| 亚洲夫妻自拍| 久久久久99| 国产一区二区三区在线免费观看| 亚洲人成人一区二区在线观看| 在线观看亚洲精品视频| 久久成人综合网| 久久久久久**毛片大全| 国产亚洲人成a一在线v站| 亚洲嫩草精品久久| 欧美在线观看www| 国产精品毛片高清在线完整版| 亚洲精品自在久久| 一本久久青青| 欧美色图首页| 亚洲专区一区| 欧美在线亚洲一区| 国产精品久久久亚洲一区| 亚洲在线不卡| 久久人人97超碰国产公开结果| 狠狠久久亚洲欧美| 久久久中精品2020中文| 亚洲风情亚aⅴ在线发布| 亚洲人成网站影音先锋播放| 欧美精品高清视频| 一区二区三区不卡视频在线观看| 亚洲综合成人在线| 国产精品美女久久久浪潮软件 | 香蕉久久一区二区不卡无毒影院 | 亚洲国产一区二区三区青草影视| 亚洲人成人99网站| 欧美日韩另类国产亚洲欧美一级| 亚洲欧洲精品一区二区三区 | 亚洲午夜久久久久久尤物| 国产精品wwwwww| 欧美一区二区三区精品电影| 你懂的国产精品| 日韩视频中文字幕| 国产精品一区二区a| 久久精品理论片| 亚洲激情在线视频| 亚洲欧美日韩爽爽影院| 狠狠色丁香婷婷综合久久片| 欧美精品在线视频| 欧美专区在线播放| 亚洲人体大胆视频| 久久久999国产| 9人人澡人人爽人人精品| 国产欧美激情| 欧美激情亚洲| 欧美在线你懂的| 亚洲精品欧美日韩| 久久伊人精品天天| 一本综合久久| 在线观看国产精品网站| 国产精品盗摄久久久| 老司机aⅴ在线精品导航| 亚洲免费久久| 欧美成人免费在线| 羞羞视频在线观看欧美| 99精品99| 亚洲国产精品一区在线观看不卡| 国产精品久久久久久福利一牛影视 | 午夜在线a亚洲v天堂网2018| 欧美好骚综合网| 国产自产高清不卡| 欧美日韩成人精品| 久久深夜福利| 午夜一区二区三区在线观看| 亚洲日本欧美日韩高观看| 久久久夜夜夜| 午夜视频一区二区| 日韩视频一区二区三区在线播放免费观看 | 亚洲精品中文字幕女同| 久久久夜夜夜| 久久成人人人人精品欧| 9国产精品视频| 亚洲国产精品视频| 国内精品久久久久久久影视麻豆 | 亚洲视频精选| 亚洲精品中文字幕女同| 雨宫琴音一区二区在线| 国内外成人在线视频| 国产欧美日韩一区二区三区在线| 欧美色道久久88综合亚洲精品| 欧美不卡福利| 老司机精品久久| 久久久精品五月天| 久久av一区二区三区漫画| 亚洲欧美日韩精品在线| 亚洲一区二区三区激情| 亚洲无玛一区| 亚洲午夜久久久| 亚洲性视频网址| 亚洲在线免费| 欧美一区二区三区四区在线观看 | 欧美一区二区三区男人的天堂| 亚洲自拍偷拍视频| 亚洲一区日韩| 亚洲影院一区| 欧美一区二区精品在线| 欧美中文字幕在线视频| 久久久久久久久久久成人| 久久久五月天| 麻豆久久久9性大片| 欧美高清视频免费观看| 欧美大片免费| 欧美日韩国产成人精品| 欧美体内she精视频| 国产精品日韩一区| 国产丝袜一区二区| 在线视频成人| 99ri日韩精品视频| 亚洲欧美久久久| 久久男人资源视频| 亚洲成在线观看| 99精品免费| 久久狠狠一本精品综合网|