• <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>
            隨筆 - 60, 文章 - 0, 評(píng)論 - 197, 引用 - 0
            數(shù)據(jù)加載中……

            用libxml 解析XML (二)

            寫屬性
            寫屬性類似于給一個(gè)新元素寫文本。在這個(gè)例子中,我們將添加一個(gè)reference結(jié)點(diǎn)URI屬性到我們的文檔中。完整代碼:附錄F,添加屬性例程代碼。 referencestory元素的一個(gè)子結(jié)點(diǎn),所以找到并插入新元素及其屬性是簡(jiǎn)單的。一旦我們?cè)?/span>parseDoc進(jìn)行了錯(cuò)誤檢查,我們將在正確的位置加放我們的新元素。但進(jìn)行之前我們需要定義一個(gè)此前我們不見過的數(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)容寫入磁盤。
             
            取得屬性
            取得屬性值類似于前面我們?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ù)編碼兼容問題是程序員新建普通的XML或特定XML時(shí)最常見的困難。按照這里

               稍后的討論來思考設(shè)計(jì)你的應(yīng)用程序?qū)椭惚苊膺@個(gè)困難。實(shí)際上,libxml能以UTF-8格式保存和操縱多種數(shù)據(jù) 
            你的程序使用其它的數(shù)據(jù)格式,比如常見的ISO-8859-1編碼,必須使用libxml函數(shù)轉(zhuǎn)換到UTF-8。如果你想你的程序以除UTF-8外的其它編碼方式輸出也必須做轉(zhuǎn)換。 
               
            如果能有效地轉(zhuǎn)換數(shù)據(jù)Libxml將使用轉(zhuǎn)換器。無轉(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è)常見錯(cuò)誤是在內(nèi)部數(shù)據(jù)不同的部分使用不同的編碼格式。最常見的是情況是一個(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ù)指針返回,如果沒有找到則返回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,它一般用于編譯和鏈接程序到庫時(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 閱讀(1889) 評(píng)論(0)  編輯 收藏 引用 所屬分類: XML

            久久精品www人人爽人人| 久久久久久久99精品免费观看| 久久精品国产91久久综合麻豆自制 | 久久综合久久久| 国产99精品久久| 精品国产一区二区三区久久| 久久精品亚洲精品国产色婷| 久久精品亚洲日本波多野结衣| 九九精品99久久久香蕉| 久久久久国产一级毛片高清版| 久久亚洲国产欧洲精品一| 久久精品无码一区二区三区免费| 久久久久亚洲AV无码专区桃色| 久久国内免费视频| 天天躁日日躁狠狠久久| 99精品久久精品| 久久久噜噜噜久久中文字幕色伊伊| 欧美精品福利视频一区二区三区久久久精品| 久久成人精品| 久久精品国产99国产精品亚洲| 午夜精品久久久久久中宇| 久久ww精品w免费人成| 国产激情久久久久影院老熟女免费 | 久久一本综合| 无码超乳爆乳中文字幕久久 | 91精品国产高清久久久久久91| 国产精品久久久99| 亚洲国产精品无码久久久不卡 | 久久妇女高潮几次MBA| 香蕉久久夜色精品国产小说| 一级A毛片免费观看久久精品| 久久综合香蕉国产蜜臀AV| 久久久久久一区国产精品| 亚洲精品高清国产一线久久| 国产高清国内精品福利99久久| 亚洲国产一成久久精品国产成人综合| 亚洲国产精品无码久久| 狠狠色伊人久久精品综合网| 人妻无码中文久久久久专区| 久久综合给合综合久久| 狠狠色婷婷久久一区二区三区|