• <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, 評論 - 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-8UTF-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 閱讀(1889) 評論(0)  編輯 收藏 引用 所屬分類: XML

            性欧美丰满熟妇XXXX性久久久 | 国产精品免费久久久久影院 | 曰曰摸天天摸人人看久久久| 久久久久久毛片免费播放| 人妻无码αv中文字幕久久 | 久久不见久久见免费视频7| 久久精品国产精品亚洲精品 | 国内精品九九久久久精品| 精品少妇人妻av无码久久| 久久久久久久综合日本亚洲| 久久久噜噜噜久久中文字幕色伊伊| 久久丝袜精品中文字幕| 久久天天躁狠狠躁夜夜96流白浆| 精品综合久久久久久98| 久久er国产精品免费观看2| 色综合久久最新中文字幕| 久久天天躁狠狠躁夜夜2020老熟妇 | 久久精品国产一区| 99精品国产综合久久久久五月天| 久久91精品国产91久久麻豆| 99久久这里只精品国产免费| 伊人久久精品线影院| 久久99热只有频精品8| 性欧美大战久久久久久久久| 久久久黄色大片| 亚洲日本va午夜中文字幕久久 | 中文字幕久久亚洲一区| 欧美激情精品久久久久久久九九九| 大伊人青草狠狠久久| 俺来也俺去啦久久综合网| 精品国产乱码久久久久久郑州公司| 久久久久久久精品妇女99| 久久人人爽人人爽人人片av麻烦| 亚洲乱码日产精品a级毛片久久 | 国产精品久久久久久久app | 99久久www免费人成精品| 国产91久久综合| 久久天天躁狠狠躁夜夜2020| 一本久久免费视频| 77777亚洲午夜久久多喷| 国产精品毛片久久久久久久 |