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

            亚洲综合婷婷久久| 久久99热只有频精品8| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 色狠狠久久AV五月综合| 久久精品一区二区国产| 亚洲精品乱码久久久久久蜜桃| 亚洲国产精品无码久久SM| 久久国产成人亚洲精品影院| 亚洲va久久久噜噜噜久久| 久久久久亚洲AV成人网| 国产成人久久精品一区二区三区 | 天天久久狠狠色综合| 色播久久人人爽人人爽人人片aV | 99热精品久久只有精品| 久久精品无码一区二区WWW| 99久久99这里只有免费费精品| 久久精品国产精品亚洲毛片 | 性做久久久久久久久老女人| 91精品国产高清久久久久久国产嫩草| 99久久国产热无码精品免费久久久久| 久久久久成人精品无码中文字幕 | 91性高湖久久久久| 亚洲精品乱码久久久久久中文字幕| 久久精品国产一区二区三区不卡| 亚洲欧美成人综合久久久| 欧美久久久久久精选9999| 99久久精品久久久久久清纯| 久久婷婷综合中文字幕| 久久亚洲AV成人无码国产| 亚洲香蕉网久久综合影视| 久久久精品国产| 婷婷久久综合九色综合九七| 久久久久综合国产欧美一区二区| 久久99国产精品久久99果冻传媒| 欧洲成人午夜精品无码区久久| 久久久www免费人成精品| 久久无码AV中文出轨人妻| 国内精品伊人久久久影院| 久久这里都是精品| 色狠狠久久综合网| 精品久久久久久久国产潘金莲 |