• <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
            數(shù)據(jù)加載中……

            用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. 編碼轉(zhuǎn)換例程代碼
            #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

            人妻精品久久久久中文字幕69| 久久久久人妻一区二区三区| 精品久久久久久无码专区| 国产精品久久久久9999高清| 伊人丁香狠狠色综合久久| 久久精品极品盛宴观看| 91精品国产综合久久久久久| 久久精品国产清自在天天线| 久久频这里精品99香蕉久| 精品国产91久久久久久久| 久久夜色精品国产噜噜亚洲a| 99久久国语露脸精品国产| 天天做夜夜做久久做狠狠| 91精品国产综合久久精品| 午夜精品久久久久久中宇| 久久精品国产只有精品66| 久久天堂AV综合合色蜜桃网| 婷婷久久综合九色综合绿巨人| 国产成人久久激情91| 无码人妻久久久一区二区三区| 日韩精品无码久久一区二区三| 狠狠久久亚洲欧美专区| 日产精品99久久久久久| 日韩AV无码久久一区二区| 亚洲中文字幕久久精品无码喷水| 久久免费99精品国产自在现线 | 久久这里有精品视频| 久久久久一区二区三区| 久久不射电影网| 丰满少妇人妻久久久久久| 久久亚洲国产成人精品性色| 欧美亚洲色综久久精品国产| 亚洲av伊人久久综合密臀性色| 2021国产精品久久精品| 亚洲精品无码久久久久去q | 久久99精品国产一区二区三区| 色诱久久久久综合网ywww| 蜜臀久久99精品久久久久久小说| 久久综合久久自在自线精品自| 国产精品美女久久久久久2018| 国产精品禁18久久久夂久|