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

            久久99精品久久久久久久不卡| 色婷婷久久综合中文久久蜜桃av| 精品久久久久久综合日本| 久久99精品综合国产首页| 国产精品综合久久第一页| 亚洲精品美女久久久久99小说| 中文字幕精品无码久久久久久3D日动漫 | 久久中文字幕人妻丝袜| 色诱久久久久综合网ywww| 国产精品久久久久一区二区三区 | 亚洲国产精品一区二区久久hs | 久久人人爽人人人人爽AV | 奇米综合四色77777久久| 亚洲国产成人久久综合碰碰动漫3d| 久久97久久97精品免视看秋霞| 久久笫一福利免费导航 | 久久精品国产清高在天天线| 久久精品三级视频| 国产亚洲色婷婷久久99精品| 久久久久久一区国产精品| 99久久99这里只有免费费精品| 亚洲国产成人久久精品99| 精品精品国产自在久久高清| 亚洲国产精品无码久久98| 久久er国产精品免费观看8| 成人久久精品一区二区三区| 蜜桃麻豆WWW久久囤产精品| 国产激情久久久久影院| 久久最近最新中文字幕大全| 久久综合精品国产二区无码| 久久久久久久波多野结衣高潮| 手机看片久久高清国产日韩| 狠狠精品干练久久久无码中文字幕| 久久99国产精品尤物| 一本色道久久综合狠狠躁| 亚洲中文字幕无码久久精品1| 久久中文字幕精品| 久久亚洲中文字幕精品一区| 久久国内免费视频| 精品人妻伦九区久久AAA片69| 亚洲av成人无码久久精品|