version 1.1.2.1, 2010/09/27 10:51:01
|
version 1.1.2.4, 2010/09/28 11:37:04
|
Line 1
|
Line 1
|
#include "global.h" |
#include "global.h" |
|
#include <axl.h> |
|
#include <axl_ns.h> |
|
#include <axl_decl.h> |
|
#include "xmler.h" |
|
|
|
|
|
int Verbose; |
|
extern char compiled[], compiledby[], compilehost[]; |
|
|
|
|
|
static void Usage() |
|
{ |
|
|
|
printf( "XMLer is tool for managment R/W operation with XMLs\n" |
|
"=== %s === %s@%s ===\n\n" |
|
" Syntax: xmler [options] <file.xml> [data]\n\n" |
|
"\t-v\t\tVerbose ...\n" |
|
"\t-s <av_pair>\tSet Attribute/Value pair\n" |
|
"\t-g <av_pair>\tGet Attribute/Value pair\n" |
|
"*\"av_pair\" format: [ns:]node[[|attribute[=value]]?data]\n" |
|
"\n", compiled, compiledby, compilehost); |
|
} |
|
|
int |
int |
main(int argc, char **argv) |
main(int argc, char **argv) |
{ |
{ |
return 0; | char ch, *ctx, str[STRSIZ], szName[MAXPATHLEN], m = 0; |
| int ctxlen, n, ret = 0; |
| axlDoc *doc = NULL; |
| axlError *err = NULL; |
| axlNode *node = NULL; |
| struct tagReqXML xr; |
| |
| memset(str, 0, STRSIZ); |
| memset(&xr, 0, sizeof xr); |
| while ((ch = getopt(argc, argv, "hvs:g:")) != -1) |
| switch (ch) { |
| case 'v': |
| Verbose++; |
| break; |
| case 's': |
| if (m) { |
| Usage(); |
| return 1; |
| } else |
| m = 's'; |
| strlcpy(str, optarg, STRSIZ); |
| if ((ret = ioXMLGet(str, &xr)) < 1) { |
| printf("Error:: in XML request %s\n", str); |
| return 1; |
| } |
| VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret); |
| break; |
| case 'g': |
| if (m) { |
| Usage(); |
| return 1; |
| } else |
| m = 'g'; |
| strlcpy(str, optarg, STRSIZ); |
| if ((ret = ioXMLGet(str, &xr)) < 1) { |
| printf("Error:: in XML request %s\n", str); |
| return 1; |
| } |
| VERB(3) printf("Verbose(3):: XMLGet=0x%x\n", ret); |
| break; |
| case 'h': |
| default: |
| Usage(); |
| return 1; |
| } |
| argc -= optind; |
| argv += optind; |
| if (!argc) { |
| Usage(); |
| return 1; |
| } else |
| strlcpy(szName, *argv, MAXPATHLEN); |
| if (argc > 1 && argv[1]) { |
| xr.xml_data.value = argv[1]; |
| xr.xml_data.vallen = strlen(argv[1]); |
| } |
| |
| axl_init(); |
| if (!(doc = axl_doc_parse_from_file(szName, &err))) { |
| printf("Error:: xml file %s #%d - %s\n", szName, |
| axl_error_get_code(err), axl_error_get(err)); |
| axl_error_free(err); |
| axl_end(); |
| return 2; |
| } |
| if (!axl_ns_doc_validate(doc, &err)) { |
| printf("Error:: xml file %s namespace validation #%d - %s\n", szName, |
| axl_error_get_code(err), axl_error_get(err)); |
| axl_error_free(err); |
| axl_end(); |
| return 2; |
| } |
| |
| switch (m) { |
| case 'g': |
| if (!xr.xml_namespace.vallen) { |
| if (ret == 32) { |
| if (!(ctx = (char*) axl_doc_get_content_at(doc, xr.xml_node.path.value, &ctxlen))) { |
| printf("GET:: path %s - not found!\n", xr.xml_node.path.value); |
| ret = 1; |
| goto end; |
| } |
| } else { |
| if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) { |
| printf("GET:: node %s - not found!\n", xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } |
| } |
| } else { |
| strlcpy(str, xr.xml_namespace.value, sizeof str); |
| strlcat(str, ":", sizeof str); |
| strlcat(str, xr.xml_node.container.value, sizeof str); |
| if (ret == 32) { |
| if (!(ctx = (char*) axl_doc_get_content_at(doc, str, &ctxlen))) { |
| printf("GET:: path %s:%s - not found!\n", xr.xml_namespace.value, |
| xr.xml_node.path.value); |
| ret = 1; |
| goto end; |
| } |
| } else { |
| if (!(node = axl_doc_find_called(doc, str))) { |
| printf("GET:: node %s:%s - not found!\n", xr.xml_namespace.value, |
| xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } |
| } |
| } |
| |
| if (!(ret & 32) && xr.xml_data.vallen) { |
| if (!(ctx = (char*) axl_node_get_content(node, &ctxlen))) { |
| printf("GET:: data %s for node %s - not found!\n", |
| xr.xml_data.value, xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } else |
| VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen); |
| |
| VERB(1) printf("\n"); |
| if (!strcmp(ctx, xr.xml_data.value)) |
| printf("DATA::1\n"); |
| else |
| printf("DATA::0\n"); |
| } |
| |
| if (!(ret & 32) && xr.xml_attribute.vallen) { |
| if ((n = axl_node_num_attributes(node)) < 1) { |
| printf("GET:: attribute %s for node %s - not found!\n", |
| xr.xml_attribute.value, xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } else { |
| VERB(1) printf("Verbose:: node have %d attributes\n", n); |
| |
| if (!(ctx = (char*) axl_node_get_attribute_value(node, xr.xml_attribute.value))) { |
| printf("GET:: attribute %s for node %s - not found!\n", |
| xr.xml_attribute.value, xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } |
| |
| if (xr.xml_value.vallen) { |
| if (!strcmp(ctx, xr.xml_value.value)) |
| ctx = "VALUE::1"; |
| else |
| ctx = "VALUE::0"; |
| } |
| } |
| } else { |
| if (!(ret & 32) && !(ctx = (char*) axl_node_get_content(node, &ctxlen))) { |
| printf("GET:: data for node %s - not found!\n", xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } else |
| VERB(3) printf("Verbose(3):: Returned bytes %d\n", ctxlen); |
| } |
| |
| VERB(1) printf("\n"); |
| printf("%s\n", ctx); |
| ret = 0; |
| break; |
| case 's': |
| if (!xr.xml_namespace.vallen) { |
| if (ret == 32) { |
| // insert new |
| } else { |
| // update old |
| if (!(node = axl_doc_find_called(doc, xr.xml_node.container.value))) { |
| printf("SET:: node %s - not found!\n", xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } |
| } |
| } else { |
| strlcpy(str, xr.xml_namespace.value, sizeof str); |
| strlcat(str, ":", sizeof str); |
| strlcat(str, xr.xml_node.container.value, sizeof str); |
| if (ret == 32) { |
| // insert new |
| } else { |
| // update old |
| if (!(node = axl_doc_find_called(doc, str))) { |
| printf("SET:: node %s:%s - not found!\n", xr.xml_namespace.value, |
| xr.xml_node.container.value); |
| ret = 1; |
| goto end; |
| } |
| } |
| } |
| |
| if (!(ret & 32) && xr.xml_data.vallen) { |
| axl_node_set_is_empty(node, 1); |
| axl_node_set_content(node, xr.xml_data.value, xr.xml_data.vallen); |
| } |
| if (!(ret & 32) && xr.xml_attribute.vallen) { |
| axl_node_remove_attribute(node, xr.xml_attribute.value); |
| axl_node_set_attribute(node, xr.xml_attribute.value, xr.xml_value.value); |
| } |
| |
| xr.xml_data = xr.xml_node.container; |
| ret = 0; |
| default: |
| if (xr.xml_data.vallen) { |
| if (!(node = axl_doc_find_called(doc, xr.xml_data.value))) { |
| printf("GET:: node %s - not found!\n", xr.xml_data.value); |
| ret = 1; |
| goto end; |
| } |
| axl_node_dump_pretty(node, &ctx, &ctxlen, 4); |
| VERB(1) printf("Verbose:: Node length=%d\n", ctxlen); |
| } else { |
| axl_doc_dump_pretty(doc, &ctx, &ctxlen, 4); |
| VERB(1) printf("Verbose:: Document length=%d\n", ctxlen); |
| } |
| |
| VERB(1) printf("\n"); |
| printf("%s\n", ctx); |
| if (ctx) |
| free(ctx); |
| } |
| end: |
| axl_doc_free(doc); |
| axl_end(); |
| return ret; |
} |
} |