• <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 (三)

            D. XPath例程代碼
            #include <libxml/parser.h>
            #include <libxml/xpath.h>

            xmlDocPtr
            getdoc (char *docname) {
              xmlDocPtr doc;
              doc = xmlParseFile(docname);
              if (doc == NULL ) {
                fprintf(stderr,"Document not parsed successfully. \n");
                return NULL;
              }  
              return doc;
            }

            xmlXPathObjectPtr
            getnodeset (xmlDocPtr doc, xmlChar *xpath){
              xmlXPathContextPtr context;
              xmlXPathObjectPtr result;
              context = xmlXPathNewContext(doc);
              result = xmlXPathEvalExpression(xpath, context);
              if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
                printf("No result\n");
                return NULL;
              }
              xmlXPathFreeContext(context);
              return result;
            }


            int
            main(int argc, char **argv) {
              char *docname;
              xmlDocPtr doc;
              xmlChar *xpath = ("http://keyword");
              xmlNodeSetPtr nodeset;
              xmlXPathObjectPtr result;
              int i;
              xmlChar *keyword;
              if (argc <= 1) {
                printf("Usage: %s docname\n", argv[0]);
                return(0);
              }
              docname = argv[1];
              doc = getdoc(docname);
              result = getnodeset (doc, xpath);
              if (result) {
                nodeset = result->nodesetval;
                for (i=0; i < nodeset->nodeNr; i++) {
                  keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->printf
                     ("keyword: %s\n", keyword);
                     xmlFree(keyword);
                     } 
                     xmlXPathFreeObject (result);
                }
                xmlFreeDoc(doc);
                xmlCleanupParser();
                return (1); 
            }

            E. 添加keyword例程代碼
            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <libxml/xmlmemory.h>
            #include <libxml/parser.h> 

            void 
            parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
                xmlNewTextChild (cur, NULL, "keyword", keyword);
                return;
              }

            xmlDocPtr 
            parseDoc(char *docname, char *keyword) {
                xmlDocPtr doc;
                xmlNodePtr cur;
                doc = xmlParseFile(docname);
                if (doc == NULL ) {
                  fprintf(stderr,"Document not parsed successfully. \n");
                  return (NULL);
                }
                cur = xmlDocGetRootElement(doc);
                if (cur == NULL) {
                  fprintf(stderr,"empty document\n");
                  xmlFreeDoc(doc);
                  return (NULL);
                }
                if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
                  fprintf(stderr,"document of the wrong type, root node != story");
                  xmlFreeDoc(doc);
                  return (NULL);
                }
                cur = cur->xmlChildrenNode;
                while (cur != NULL) {
                  if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
                    parseStory (doc, cur, keyword);
                  }
                  cur = cur->next;
                }
                return(doc);
            }


            int
            main(int argc, char **argv) {
                char *docname;
                char *keyword;
                xmlDocPtr doc;
                if (argc <= 2) {
                  printf("Usage: %s docname, keyword\n", argv[0]);
                  return(0);
                }
                docname = argv[1];
                keyword = argv[2];
                doc = parseDoc (docname, keyword);
                if (doc != NULL) {
                  xmlSaveFormatFile (docname, doc, 0);
                  xmlFreeDoc(doc);
                }
                return (1);
            }


            F. 添加屬性例程代碼
            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <libxml/xmlmemory.h>
            #include <libxml/parser.h>

            xmlDocPtr
            parseDoc(char *docname, char *uri) {
                xmlDocPtr doc;
                xmlNodePtr cur;
                xmlNodePtr newnode;
                xmlAttrPtr newattr;
                doc = xmlParseFile(docname);
                if (doc == NULL ) {
                  fprintf(stderr,"Document not parsed successfully. \n");
                  return (NULL);
                }
                cur = xmlDocGetRootElement(doc);
                if (cur == NULL) {
                  fprintf(stderr,"empty document\n");
                  xmlFreeDoc(doc);
                  return (NULL);
                }
                if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
                  fprintf(stderr,"document of the wrong type, root node != story");
                  xmlFreeDoc(doc);
                  return (NULL);
                }
                newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
                newattr = xmlNewProp (newnode, "uri", uri);
                return(doc);
            }

            int
            main(int argc, char **argv) {
                char *docname;
                char *uri;
                xmlDocPtr doc;
                if (argc <= 2) {
                  printf("Usage: %s docname, uri\n", argv[0]);
                  return(0);
                }
                docname = argv[1];
                uri = argv[2];
                doc = parseDoc (docname, uri);
                if (doc != NULL) {
                  xmlSaveFormatFile (docname, doc, 1);
                  xmlFreeDoc(doc);
                }
                return (1);
            }


            G. 取得屬性值例程代碼
            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <libxml/xmlmemory.h>
            #include <libxml/parser.h>

            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;
            }


            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;
              }
              getReference (doc, cur);
              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);
            }



            H. 編碼轉換例程代碼
            #include <string.h>
            #include <libxml/parser.h>

            unsigned char*
            convert (unsigned char *in, char *encoding) {
              unsigned char *out;
              int ret,size,out_size,temp;
              xmlCharEncodingHandlerPtr handler;
              size = (int)strlen(in)+1;
              out_size = size*2-1;
              out = malloc((size_t)out_size);
              if (out) {
                handler = xmlFindCharEncodingHandler(encoding);
                if (!handler) {
                  free(out);
                  out = NULL;
                }
              }
              if (out) {
                temp=size-1;
                ret = handler->input(out, &out_size, in, &temp);
                if (ret || temp-size+1) {
                  if (ret) {  
                    printf("conversion wasn't successful.\n");
                  } else {
                    printf("conversion wasn't successful. converted:");
                  }
                  free(out);
                  out = NULL;
                } else {
                  out = realloc(out,out_size+1);
                  out[out_size]=0; /*null terminating out*/
                }
              } else {
                printf("no mem\n");
              }
              return (out);
            }


            int
            main(int argc, char **argv) {
              unsigned char *content, *out;
              xmlDocPtr doc;
              xmlNodePtr rootnode;
              char *encoding = "ISO-8859-1";
              if (argc <= 1) {
                printf("Usage: %s content\n", argv[0]);
                return(0);
              }
              content = argv[1];
              out = convert(content, encoding);
              doc = xmlNewDoc ("1.0");
              rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);
              xmlDocSetRootElement(doc, rootnode);
              xmlSaveFormatFileEnc("-", doc, encoding, 1);
              return (1);
            }


            char *convert(char *instr,char *encoding) {
              xmlCharEncodingHandlerPtr handler;
              xmlBufferPtr in,out;
              handler = xmlFindCharEncodingHandler(encoding);
              if(NULL != handler) {
                in = xmlBufferCreate();
                xmlBufferWriteChar(in,instr);
                out = xmlBufferCreate();
                if(xmlCharEncInFunc(handler, out, in) 〈 0) {
                   xmlBufferFree(in);
                   xmlBufferFree(out);
                   return NULL;
                  }
                  else {
                    xmlBufferFree(in);
                    return (char *)out-〉content;
                  }
              }
            }

            posted on 2007-08-27 17:43 Normandy 閱讀(3605) 評論(0)  編輯 收藏 引用 所屬分類: XML

            成人国内精品久久久久一区| 一本久久a久久精品综合夜夜| 国产精品成人99久久久久| 久久久久久久亚洲精品| 国内精品久久国产| 久久亚洲精品成人AV| 久久精品亚洲欧美日韩久久| 久久久久亚洲av无码专区导航| 99re久久精品国产首页2020| 一本色综合久久| 国产一区二区三精品久久久无广告 | 婷婷综合久久狠狠色99h| 日韩欧美亚洲国产精品字幕久久久| 777午夜精品久久av蜜臀| 免费一级欧美大片久久网| 2021久久国自产拍精品| 一本大道久久香蕉成人网| 亚洲天堂久久精品| 久久99国产精品久久| 亚洲国产美女精品久久久久∴| 香蕉aa三级久久毛片| 久久久久久av无码免费看大片| www久久久天天com| 久久国产精品77777| 狠狠综合久久综合88亚洲| 青青草原综合久久大伊人| 久久亚洲中文字幕精品一区| 91精品国产色综久久| 99久久www免费人成精品| 国产精品伊人久久伊人电影| 99国内精品久久久久久久| 99久久免费只有精品国产| 欧美亚洲国产精品久久蜜芽| 91精品国产高清久久久久久91| 国产亚洲美女精品久久久久狼| 99精品久久精品一区二区| 久久国产乱子精品免费女| 成人精品一区二区久久久| 欧美久久天天综合香蕉伊| 欧美一区二区久久精品| 日韩人妻无码精品久久免费一|