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

隨筆 - 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>
            日韩一区二区精品| 久久成人免费电影| 久久夜色精品国产亚洲aⅴ| 亚洲午夜一区| 午夜精彩视频在线观看不卡| 久久躁日日躁aaaaxxxx| 亚洲精品自在在线观看| 久久精品国产欧美激情| 国产精品久久久久久久浪潮网站| 国产精品久久网| 久久精品欧美日韩精品| 亚洲国产mv| 国内精品国产成人| 麻豆9191精品国产| 模特精品裸拍一区| 国产精品激情av在线播放| 亚洲精品欧洲| 亚洲视频免费| 久久香蕉精品| 亚洲视频免费在线| 欧美aa在线视频| 亚洲欧美视频在线| 久久久综合网| 亚洲美女在线观看| 亚洲经典在线| 国产精品一区二区黑丝| 久久一区亚洲| 亚洲精品一区二区三区四区高清 | 欧美1区2区3区| 一区二区久久| 日韩亚洲一区二区| 欧美在线首页| 老司机亚洲精品| 亚洲精品日韩欧美| 一区二区三区蜜桃网| 亚洲久久在线| 欧美日韩国产一区二区| 免费在线播放第一区高清av| 亚洲国产精品999| 欧美/亚洲一区| 亚洲日本免费电影| 亚洲区欧美区| 国产日韩精品一区二区三区在线| 亚洲欧美一区二区原创| 美女999久久久精品视频| 亚洲欧美国产日韩天堂区| 久久精品女人天堂| 欧美激情1区| 欧美日韩亚洲一区在线观看| 国产一区999| 欧美高清一区二区| 欧美激情一区在线观看| 亚洲免费在线视频| 亚洲精品在线一区二区| 久久精品1区| 久久九九国产| 久久嫩草精品久久久久| 久久精品综合网| 欧美日韩精品一区二区三区| 欧美日韩福利视频| 国产精品一区二区三区免费观看| 老司机67194精品线观看| 国产精品欧美在线| 最新亚洲一区| 亚洲激情小视频| 午夜亚洲伦理| 久久aⅴ国产紧身牛仔裤| 国产欧美日韩在线视频| 久久女同互慰一区二区三区| 欧美激情成人在线| 久久久久在线观看| 国产精品一二三四| 亚洲一级免费视频| 亚洲综合三区| 国产啪精品视频| 亚洲在线网站| 欧美专区第一页| 国产免费成人在线视频| 国语精品中文字幕| 久久美女性网| 欧美成人在线网站| 99re6热在线精品视频播放速度| 免费h精品视频在线播放| 欧美激情久久久久久| 日韩亚洲国产欧美| 午夜免费久久久久| 亚洲一区二区黄| 国产精品看片你懂得| 欧美日韩二区三区| 先锋亚洲精品| 亚洲综合999| 亚洲国产精品一区二区第一页| 99国产精品99久久久久久| 亚洲精品国产精品乱码不99| 嫩草伊人久久精品少妇av杨幂| 国产精品嫩草久久久久| 午夜在线电影亚洲一区| 国产麻豆9l精品三级站| aⅴ色国产欧美| 亚洲精品日韩欧美| 欧美激情一区二区| 亚洲男同1069视频| 欧美一区二区三区免费视频 | 午夜精品福利一区二区蜜股av| 亚洲一区三区电影在线观看| 国模私拍视频一区| 亚洲国产清纯| 国产精品性做久久久久久| 可以看av的网站久久看| 欧美日韩在线一区| 欧美高清在线视频| 国产欧美精品xxxx另类| 亚洲黄色一区| 精品白丝av| 亚洲欧美综合精品久久成人| 一区二区三区你懂的| 久久久噜噜噜久久中文字免| 亚洲久久一区| 快射av在线播放一区| 午夜精品久久久久| 欧美精品福利视频| 欧美好吊妞视频| 国产欧美日韩亚洲一区二区三区| 亚洲激情成人| 亚洲大片av| 久久av老司机精品网站导航| 亚洲在线黄色| 国产精品国产精品国产专区不蜜| 亚洲国产一区二区三区青草影视| 国内精品伊人久久久久av影院 | 亚洲欧美国产高清va在线播| 9国产精品视频| 欧美高清视频www夜色资源网| 蜜臀91精品一区二区三区| 国产日韩精品久久| 午夜精品美女自拍福到在线| 午夜精品美女久久久久av福利| 欧美精品国产精品| 亚洲精品日韩精品| 亚洲视频播放| 国产精品视频第一区| 亚洲欧美影音先锋| 在线精品国产欧美| 国产欧美一区二区视频| 在线视频精品一区| 一区二区国产日产| 欧美视频免费在线| 亚洲一区二区三区影院| 欧美一区成人| 国模精品娜娜一二三区| 久久国产综合精品| 欧美插天视频在线播放| 亚洲日韩中文字幕在线播放| 欧美日韩1区2区| 亚洲伊人一本大道中文字幕| 久久av一区二区| 亚洲电影观看| 欧美视频福利| 欧美日韩在线一区二区三区| 国产精品免费网站| 一区二区三区三区在线| 在线一区二区三区四区| 国产精品v欧美精品v日本精品动漫 | 欧美日韩激情网| 在线视频欧美日韩| 久久高清免费观看| 亚洲国产精品美女| 欧美日韩国产综合视频在线观看| 在线一区视频| 免费视频亚洲| 亚洲在线免费| 在线观看视频一区| 国产精品大片免费观看| 免费不卡欧美自拍视频| 亚洲国产精品va在线观看黑人 | 亚洲精品日韩综合观看成人91| 欧美日韩中文字幕| 久久久久九九九九| 一本大道久久a久久精品综合| 久久久亚洲人| 亚洲影院在线| 91久久精品一区二区三区| 国产精品人人做人人爽| 欧美黄色免费网站| 欧美中文字幕在线| 99精品国产99久久久久久福利| 噜噜噜在线观看免费视频日韩| 亚洲影院免费| 在线一区欧美| 91久久久国产精品| 国内精品视频在线播放| 国产精品久久久久久久久久久久久 | 国产精品久久久久久久第一福利| 久久午夜精品| 久久国产精品免费一区| 在线一区欧美| 亚洲国产另类久久精品| 久久综合电影| 欧美制服丝袜第一页| 亚洲综合色网站|