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

            亚洲精品美女久久久久99| 亚洲嫩草影院久久精品| 日韩欧美亚洲综合久久影院Ds| 久久午夜电影网| 久久WWW免费人成—看片| 久久93精品国产91久久综合| 国产精品亚洲美女久久久| 免费一级欧美大片久久网| 日韩精品无码久久久久久| 婷婷久久香蕉五月综合加勒比| 人妻少妇久久中文字幕一区二区| 国产成人久久AV免费| 热RE99久久精品国产66热| 色欲久久久天天天综合网精品 | 久久综合视频网| 久久无码人妻一区二区三区| 99久久精品免费观看国产| 精品无码久久久久国产动漫3d| 久久亚洲中文字幕精品有坂深雪 | 国产麻豆精品久久一二三| 久久久99精品成人片中文字幕 | 久久久艹| 久久久综合九色合综国产| 97精品伊人久久大香线蕉| 久久精品成人免费看| 无码国内精品久久人妻麻豆按摩| 久久夜色精品国产欧美乱| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 欧美久久久久久| 99久久婷婷国产综合精品草原| 77777亚洲午夜久久多人| 亚洲熟妇无码另类久久久| 精品久久久一二三区| 久久亚洲天堂| 超级碰久久免费公开视频| 天天影视色香欲综合久久| 精品免费久久久久国产一区| 久久久久无码精品国产| 久久精品蜜芽亚洲国产AV| 久久久www免费人成精品| 亚洲国产日韩欧美久久|