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

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

用libxml 解析XML (二)

寫(xiě)屬性
寫(xiě)屬性類似于給一個(gè)新元素寫(xiě)文本。在這個(gè)例子中,我們將添加一個(gè)reference結(jié)點(diǎn)URI屬性到我們的文檔中。完整代碼:附錄F,添加屬性例程代碼。 referencestory元素的一個(gè)子結(jié)點(diǎn),所以找到并插入新元素及其屬性是簡(jiǎn)單的。一旦我們?cè)?/span>parseDoc進(jìn)行了錯(cuò)誤檢查,我們將在正確的位置加放我們的新元素。但進(jìn)行之前我們需要定義一個(gè)此前我們不見(jiàn)過(guò)的數(shù)據(jù)類型。
 
xmlAttrPtr newattr;
 
我們也需要xmlNodePtr
 
xmlNodePtr newnode;
 
剩下的parseDoc則和前面一樣,檢查根結(jié)點(diǎn)是否為story。如果是的,那我們知道我們將在指定的位置添加我們的元素。  
newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
newattr = xmlNewProp (newnode, "uri", uri);
 
使用xmlNewTextChild函數(shù)添國(guó)一個(gè)新結(jié)點(diǎn)到當(dāng)前結(jié)點(diǎn)位置。
一旦結(jié)點(diǎn)被添加,文件應(yīng)像前面的例子將我們添加的元素及文本內(nèi)容寫(xiě)入磁盤。
 
取得屬性
取得屬性值類似于前面我們?nèi)〉靡粋€(gè)結(jié)點(diǎn)的文本內(nèi)容。在這個(gè)例子中,我們將取出我們?cè)谇耙徊糠痔砑拥?/span>URI的值。完整代碼:附錄G,取得屬性值例程代碼。


  
這個(gè)例子的初始步驟和前面是類似的:解析文檔,查找你感興趣的元素,然后進(jìn)入一個(gè)函數(shù)完成指定的請(qǐng)求任務(wù)。在這個(gè)例子中,我們調(diào)用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;
}
 
 關(guān)鍵函數(shù)是xmlGetProp,它返回一個(gè)包含屬性值的xmlChar。在本例中,我們僅僅打印它。
 
注釋
如果你使用DTD定義屬性的固定值或缺省值,這個(gè)函數(shù)也將取得它。
 
編碼轉(zhuǎn)換
數(shù)據(jù)編碼兼容問(wèn)題是程序員新建普通的XML或特定XML時(shí)最常見(jiàn)的困難。按照這里

   稍后的討論來(lái)思考設(shè)計(jì)你的應(yīng)用程序?qū)椭惚苊膺@個(gè)困難。實(shí)際上,libxml能以UTF-8格式保存和操縱多種數(shù)據(jù) 
你的程序使用其它的數(shù)據(jù)格式,比如常見(jiàn)的ISO-8859-1編碼,必須使用libxml函數(shù)轉(zhuǎn)換到UTF-8。如果你想你的程序以除UTF-8外的其它編碼方式輸出也必須做轉(zhuǎn)換。 
   
如果能有效地轉(zhuǎn)換數(shù)據(jù)Libxml將使用轉(zhuǎn)換器。無(wú)轉(zhuǎn)換器時(shí),僅僅UTF-8UTF-16ISO-8859-1能夠被作為外部格式使用。有轉(zhuǎn)換器時(shí),它能將從其它格式與UTF-8互換的任何格式均可使用。當(dāng)前轉(zhuǎn)換器支持大約150種不同的編碼格式之間的相互轉(zhuǎn)換。實(shí)際支持的格式數(shù)量正在被實(shí)現(xiàn)。每一個(gè)實(shí)現(xiàn)在的轉(zhuǎn)換器盡可能的支持每一種格式。
 
警告
一個(gè)常見(jiàn)錯(cuò)誤是在內(nèi)部數(shù)據(jù)不同的部分使用不同的編碼格式。最常見(jiàn)的是情況是一個(gè)應(yīng)用以ISO-8859-1作為內(nèi)部數(shù)據(jù)格式,結(jié)合libxml部分使用UTF-8格式。結(jié)果是一個(gè)應(yīng)用程序要面對(duì)不同地內(nèi)部數(shù)據(jù)格式。一部分代碼執(zhí)行后,它或其它部分代碼將使用曲解的數(shù)據(jù)。
  
這個(gè)例子構(gòu)造一個(gè)簡(jiǎn)單的文檔,然后添加在命令行提供的內(nèi)容到根元素并使用適當(dāng)?shù)木幋a將結(jié)果輸出到標(biāo)準(zhǔn)輸出設(shè)備上。在這個(gè)例子中,我們使用ISO-8859 -1編碼。在命令輸入的內(nèi)容將被從ISO-8859-1轉(zhuǎn)換到UTF-8。完整代碼:附件H,編碼轉(zhuǎn)換例程代碼。
 
  
包含在例子中的轉(zhuǎn)換函數(shù)使用libxmlxmlFindCharEncodingHandler函數(shù)。
 
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);
 
定義一個(gè)xmlCharEncodingHandler函數(shù)指針。
XmlCharEncodingHandler函數(shù)需要給出輸入和輸出字符串的大小,這里計(jì)算輸入輸出字符串。
XmlFindCharEncodingHandler使用數(shù)據(jù)初始編碼作為參數(shù)搜索libxml已經(jīng)完成的轉(zhuǎn)換器句柄并將找到的函數(shù)指針?lè)祷兀绻麤](méi)有找到則返回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.
由句柄指定的轉(zhuǎn)換函數(shù)請(qǐng)求輸入、輸出字符中及它們的長(zhǎng)度作為參數(shù)。這個(gè)長(zhǎng)度必須由應(yīng)用程序分別指定。
用指定編碼而不是UTF-8輸出,我們使用xmlSaveFormatFileEnc指不定期編碼方式。 
 
A.
編譯
Libxml
包含一個(gè)腳本xml2-config,它一般用于編譯和鏈接程序到庫(kù)時(shí)產(chǎn)生標(biāo)志。

 為了取得預(yù)處理和編譯標(biāo)志,使用xml2-config –cflags,為了取得鏈接標(biāo)志,使用xml2-config –libs。其它有效的參數(shù)請(qǐng)使用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) 評(píng)論(0)  編輯 收藏 引用 所屬分類: XML


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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国产精品视频免费观看| 久久久伊人欧美| 欧美在线观看网站| 欧美资源在线观看| 可以看av的网站久久看| 欧美不卡在线视频| 欧美日韩午夜激情| 国产精品视频网| 在线播放一区| 一区二区激情| 欧美一级在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 狂野欧美一区| 亚洲国产片色| 日韩天堂av| 欧美视频精品在线观看| 久色婷婷小香蕉久久| 欧美激情一区二区| 国产欧美精品一区aⅴ影院| 一区二区亚洲精品国产| 日韩一区二区高清| 欧美一区二区黄| 欧美国产一区二区| 亚洲欧美日韩精品久久奇米色影视 | 欧美在线999| 欧美成人一区二区三区| 国产精品狼人久久影院观看方式| 国产一区二区三区成人欧美日韩在线观看 | 久久国产精品毛片| 欧美激情视频一区二区三区不卡| 一本色道精品久久一区二区三区 | 久久亚洲一区二区三区四区| 欧美激情综合网| 国内精品久久国产| 亚洲香蕉伊综合在人在线视看| 久久婷婷丁香| 亚洲一区在线看| 欧美日本一道本| 亚洲高清一区二| 久久精品官网| 亚洲一区二区三区在线看 | 麻豆视频一区二区| 国产欧美日韩一级| 一区二区三区精品久久久| 久久综合五月| 午夜精品久久久久久99热软件| 欧美日韩国产页| 亚洲毛片av在线| 欧美激情一区二区三区不卡| 久久av一区二区| 国产欧美日韩不卡| 亚洲欧美文学| 亚洲视频播放| 国产精品日本欧美一区二区三区| 久久精品国产v日韩v亚洲 | 亚洲综合第一页| 欧美视频一区二区三区…| 亚洲激情偷拍| 欧美激情第五页| 玖玖综合伊人| 亚洲激情电影中文字幕| 免费在线看一区| 久久亚洲欧洲| 最新亚洲激情| 亚洲七七久久综合桃花剧情介绍| 久久人人爽爽爽人久久久| 曰本成人黄色| 亚洲大片在线| 欧美国产日韩二区| 亚洲最新在线视频| 99视频一区| 国产精品日韩欧美一区二区| 午夜精品一区二区三区在线| 亚洲性av在线| 国产精品多人| 欧美一区二区三区精品| 亚洲欧美日本精品| 狠狠入ady亚洲精品经典电影| 久久综合一区| 欧美va天堂在线| 一本色道**综合亚洲精品蜜桃冫| 99这里有精品| 国产一区二三区| 欧美激情一区在线观看| 欧美另类在线观看| 欧美亚洲尤物久久| 久久久久久网址| 99精品欧美一区二区三区| 国产精品99久久久久久久女警 | 你懂的视频一区二区| 欧美成人中文字幕| 亚洲午夜精品17c| 午夜精品一区二区三区在线视| 韩国精品主播一区二区在线观看| 欧美肥婆bbw| 国产精品拍天天在线| 老鸭窝亚洲一区二区三区| 欧美精品www| 久久夜色精品国产亚洲aⅴ| 欧美久久一级| 久久偷看各类wc女厕嘘嘘偷窃| 欧美激情自拍| 毛片精品免费在线观看| 国产精品久久网站| 亚洲国产日韩一级| 国内精品久久久久久| 一本色道综合亚洲| 亚洲经典一区| 夜夜躁日日躁狠狠久久88av| 午夜精品久久久久久99热| 久久一区激情| 欧美一区二区在线视频| 另类成人小视频在线| 午夜精品久久久| 欧美日韩国产专区| 欧美gay视频激情| 国产三级精品三级| 99re8这里有精品热视频免费| 伊大人香蕉综合8在线视| 亚洲摸下面视频| 亚洲自拍另类| 欧美三级在线视频| 亚洲久久成人| av成人毛片| 欧美大胆成人| 欧美激情视频免费观看| 一区二区三区在线免费视频| 亚洲尤物精选| 亚洲欧美日韩一区二区| 欧美日韩中文字幕日韩欧美| 亚洲国产一区二区三区在线播| 樱桃成人精品视频在线播放| 午夜精品久久久久久| 欧美在线免费观看| 国产精品丝袜xxxxxxx| 亚洲视频欧美视频| 亚洲欧美在线一区二区| 国产精品国产三级国产专播精品人 | 亚洲午夜女主播在线直播| 最新亚洲一区| 欧美福利小视频| 亚洲人久久久| 在线亚洲一区| 国产精品jizz在线观看美国| 99re66热这里只有精品4| 亚洲视频一区在线| 国产精品人人爽人人做我的可爱 | 国产精品99一区二区| 一区二区久久久久久| 亚洲永久字幕| 国产麻豆一精品一av一免费| 亚洲欧美制服另类日韩| 久久午夜精品一区二区| 亚洲国产岛国毛片在线| 欧美激情综合五月色丁香小说| 夜夜嗨av一区二区三区免费区| 欧美亚洲在线| 1024成人| 欧美日韩在线第一页| 亚洲欧美日韩一区二区| 麻豆91精品91久久久的内涵| 亚洲精品美女在线观看| 欧美三级特黄| 久久超碰97中文字幕| 亚洲成色777777在线观看影院 | 欧美激情视频网站| 亚洲美女免费视频| 久久精品国产精品亚洲综合| 在线播放亚洲一区| 欧美日韩国产小视频| 亚洲欧美日韩一区二区三区在线观看 | 在线亚洲美日韩| 国产亚洲人成网站在线观看| 久久天堂国产精品| 一区二区三区精品久久久| 久久久久久免费| 在线视频日本亚洲性| 精品成人免费| 国产精品久久久久av| 噜噜噜91成人网| 欧美亚洲一区二区在线观看| 欧美黑人在线观看| 久久精品一本| 亚洲一区二区欧美| 亚洲国产日韩综合一区| 国产精品色在线| 欧美国产91| 久久久青草婷婷精品综合日韩| 一本一道久久综合狠狠老精东影业 | 在线亚洲自拍| 欧美韩日一区| 久久久久免费| 性欧美xxxx视频在线观看| av成人天堂| 亚洲精品久久久久久一区二区| 激情六月综合| 国产日产欧产精品推荐色 | 国产精品一区二区久久| 欧美伦理一区二区|