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

隨筆 - 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>
            国产精品久久久久久超碰| 欧美成人免费大片| 欧美亚洲综合久久| 一区二区三区久久久| 亚洲国产精品国自产拍av秋霞 | 欧美一进一出视频| 性欧美xxxx大乳国产app| 亚洲欧美日韩在线| 久久精品免费播放| 久久综合久久久久88| 欧美国产在线电影| 国产精品美女久久久久久免费| 国产亚洲一区二区三区在线观看 | 国产精品九九久久久久久久| 国产精品一区二区a| 国产综合在线看| 亚洲欧洲日韩在线| 亚洲欧美资源在线| 欧美电影在线免费观看网站| 亚洲激情影视| 午夜精品一区二区三区电影天堂 | 美国成人毛片| 亚洲精品免费一区二区三区| 亚洲欧美日韩精品综合在线观看| 欧美在线观看一区二区三区| 嫩草国产精品入口| 国产欧美一区二区三区另类精品| 亚洲人被黑人高潮完整版| 香蕉久久a毛片| 亚洲激情视频在线播放| 午夜精品视频在线观看一区二区| 欧美国产一区二区三区激情无套| 国产乱码精品1区2区3区| 亚洲精品女av网站| 久久久久一区二区三区四区| 一区二区三区精密机械公司| 久久久久久久999精品视频| 欧美日韩在线播放三区| 亚洲国产欧洲综合997久久| 欧美一区午夜精品| 91久久极品少妇xxxxⅹ软件| 久久国产婷婷国产香蕉| 国产精品一区久久久久| 日韩一级片网址| 亚洲高清av| 久久久一区二区三区| 亚洲午夜激情在线| 欧美视频在线不卡| 亚洲九九九在线观看| 欧美大片在线看| 久久久水蜜桃av免费网站| 国产欧美日韩亚州综合| 午夜精品国产更新| 中文网丁香综合网| 欧美日韩中文字幕综合视频| 99精品视频免费| 亚洲激情第一区| 欧美国产日产韩国视频| 日韩午夜电影| 亚洲肉体裸体xxxx137| 欧美a级片一区| 99re成人精品视频| 亚洲精品国产精品国自产观看浪潮 | 欧美国产精品日韩| 亚洲日本电影| 亚洲精品欧美日韩专区| 欧美区一区二| 亚洲手机在线| 亚洲一本大道在线| 国产精品美女一区二区在线观看| 亚洲一区二区三区国产| 亚洲最新在线视频| 国产精品成人免费| 欧美一级二区| 快射av在线播放一区| 亚洲日本一区二区三区| 亚洲精品一区二区三区蜜桃久| 欧美日韩中文精品| 欧美亚洲综合另类| 老司机午夜精品视频在线观看| 亚洲日韩第九十九页| 一区二区三区四区国产| 国产深夜精品| 欧美高清在线视频观看不卡| 欧美美女bbbb| 久久精品视频免费| 欧美激情视频一区二区三区在线播放| 亚洲特级片在线| 欧美一级大片在线免费观看| 国内精品久久久久久| 亚洲全部视频| 国产精品综合久久久| 免费观看日韩av| 国产精品成人一区二区艾草| 久久综合伊人77777蜜臀| 欧美精品在线极品| 欧美专区中文字幕| 欧美—级a级欧美特级ar全黄| 亚洲欧美日韩成人| 男女激情久久| 欧美在线免费观看亚洲| 欧美二区在线| 久久精品国产一区二区三区| 亚洲精品在线看| 国产日产欧产精品推荐色| 欧美激情第1页| 国产亚洲人成a一在线v站| 欧美激情精品久久久久久蜜臀| 国产欧美日韩视频在线观看 | 欧美在线视频a| 在线视频欧美精品| 夜夜精品视频| 欧美一区二区观看视频| 国产精品99久久久久久久久| 亚洲视频观看| 久久一区亚洲| 久久亚洲影院| 国产精品海角社区在线观看| 国内精品嫩模av私拍在线观看| 亚洲电影免费在线观看| 国产精品99久久久久久久vr| 小处雏高清一区二区三区 | 国产精品一香蕉国产线看观看 | 亚洲人成小说网站色在线| 亚洲神马久久| 老牛嫩草一区二区三区日本| 亚洲影院在线观看| 午夜日韩电影| 亚洲永久精品国产| 亚洲性视频网站| 欧美精品一卡二卡| 亚洲国产精品一区二区www| 国产一区二区三区的电影| 亚洲制服av| 亚洲一区国产一区| 欧美日韩伊人| 亚洲视屏在线播放| 亚洲欧美日韩国产一区| 欧美日韩中文字幕在线| 日韩亚洲欧美成人| 99精品国产高清一区二区 | 国产日韩精品在线观看| 亚洲三级电影在线观看| 亚洲另类一区二区| 欧美高清视频在线| 亚洲黄色免费网站| 亚洲精品小视频| 欧美激情精品久久久久久蜜臀 | 亚洲人成毛片在线播放女女| 麻豆国产精品一区二区三区| 美日韩精品视频| 亚洲第一页在线| 美女久久一区| 99视频一区| 欧美在线综合视频| 韩国v欧美v日本v亚洲v | 国产乱肥老妇国产一区二 | 亚洲激情电影中文字幕| 欧美高清视频在线| 亚洲最新中文字幕| 久久精品综合一区| 亚洲国产成人午夜在线一区| 欧美激情91| 亚洲在线一区二区| 久久综合色天天久久综合图片| 亚洲高清在线| 欧美精品亚洲一区二区在线播放| 99re亚洲国产精品| 久久精品毛片| 亚洲精品国产精品乱码不99按摩 | 日韩视频一区二区在线观看 | 欧美性猛交一区二区三区精品| 亚洲永久免费av| 欧美96在线丨欧| 午夜精品久久久久久久蜜桃app| 国产综合色精品一区二区三区| 欧美第一黄色网| 亚洲欧美精品| 亚洲激情校园春色| 久久精品视频免费| 99视频精品全部免费在线| 国产一区视频网站| 欧美精品综合| 久久影视精品| 性欧美video另类hd性玩具| 日韩午夜电影av| 免费亚洲一区| 欧美一区午夜精品| 一区二区三区视频在线播放| 激情欧美日韩一区| 国产精品日韩久久久久| 欧美区一区二| 欧美黄色一级视频| 久久久爽爽爽美女图片| av成人毛片| 亚洲国产清纯| 麻豆精品在线播放| 久久国产夜色精品鲁鲁99| 中文亚洲欧美| 欧美成人午夜77777|