예제 #1
0
파일: hpd_xml.c 프로젝트: Tibo-lg/HomePort
/**
 * Extracts the device XML description given its internal structure
 *
 * @param device_to_extract The Device that we want to extract
 *
 * @return The XML description of the device or NULL if failed
 */
  char *
extract_device_xml(Device *device_to_extract)
{
  if(device_is_in_xml_file (device_to_extract) == HPD_NO)
    return NULL;

  mxml_node_t *xml;
  xml = mxmlNewXML("1.0");

  mxml_node_t *new_device;

  new_device = mxmlNewElement(xml, "device");
  if(device_to_extract->description != NULL) mxmlElementSetAttr(new_device, "desc", device_to_extract->description);
  if(device_to_extract->ID != NULL) mxmlElementSetAttr(new_device, "id", device_to_extract->ID);
  if(device_to_extract->vendorID != NULL) mxmlElementSetAttr(new_device, "vendorID", device_to_extract->vendorID);
  if(device_to_extract->productID != NULL) mxmlElementSetAttr(new_device, "productID", device_to_extract->productID);
  if(device_to_extract->version != NULL) mxmlElementSetAttr(new_device, "version", device_to_extract->version);
  if(device_to_extract->IP != NULL) mxmlElementSetAttr(new_device, "ip", device_to_extract->IP);
  if(device_to_extract->port != NULL) mxmlElementSetAttr(new_device, "port", device_to_extract->port);
  if(device_to_extract->location != NULL) mxmlElementSetAttr(new_device, "location", device_to_extract->location);
  if(device_to_extract->type != NULL) mxmlElementSetAttr(new_device, "type", device_to_extract->type);

  char* return_string = mxmlSaveAllocString(xml, MXML_NO_CALLBACK);

  mxmlDelete(xml);

  return return_string;
}
예제 #2
0
void StreamlineSetup::sendCounters() {
	mxml_node_t *xml;
	mxml_node_t *counters;

	xml = mxmlNewXML("1.0");
	counters = mxmlNewElement(xml, "counters");
	int count = 0;
	for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) {
		count += driver->writeCounters(counters);
	}

	mxml_node_t *setup = mxmlNewElement(counters, "setup_warnings");
	mxmlNewText(setup, 0, logg.getSetup());

	if (count == 0) {
		logg.logError("No counters found, this could be because /dev/gator/events can not be read or because perf is not working correctly");
		handleException();
	}

	char* string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
	sendString(string, RESPONSE_XML);

	free(string);
	mxmlDelete(xml);
}
char* CapturedXML::getXML(bool includeTime) {
	char* xml_string;
	mxml_node_t *xml = getTree(includeTime);
	xml_string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
	mxmlDelete(xml);
	return xml_string;
}
예제 #4
0
int backup_extract_transfer_complete( mxml_node_t *node, char **msg_out, int *method_id)
{
	mxml_node_t *tree_m, *b, *n;

	tree_m = mxmlLoadString(NULL, CWMP_TRANSFER_COMPLETE_MESSAGE, MXML_NO_CALLBACK);
	if (!tree_m) goto error;

	b = mxmlFindElement(node, node, "command_key", NULL, NULL, MXML_DESCEND);
	if (!b) goto error;
	n = mxmlFindElement(tree_m, tree_m, "CommandKey", NULL, NULL, MXML_DESCEND);
	if (!n) goto error;
	n = mxmlNewText(n, 0, b->child->value.text.string);
	if (!n) goto error;

	b = mxmlFindElement(node, node, "fault_code", NULL, NULL, MXML_DESCEND);
	if (!b) goto error;
	n = mxmlFindElement(tree_m, tree_m, "FaultCode", NULL, NULL, MXML_DESCEND);
	if (!n) goto error;
	n = mxmlNewText(n, 0, b->child->value.text.string);
	if (!n) goto error;

	b = mxmlFindElement(node, node, "fault_string", NULL, NULL, MXML_DESCEND);
	if (!b) goto error;
	if (b->child && b->child->type == MXML_TEXT && b->child->value.text.string) {
		n = mxmlFindElement(tree_m, tree_m, "FaultString", NULL, NULL, MXML_DESCEND);
		if (!n) goto error;
		char *c = xml_get_value_with_whitespace(b->child);
		n = mxmlNewText(n, 0, c);
		free(c);
		if (!n) goto error;
	}

	b = mxmlFindElement(node, node, "start_time", NULL, NULL, MXML_DESCEND);
	if (!b) goto error;
	n = mxmlFindElement(tree_m, tree_m, "StartTime", NULL, NULL, MXML_DESCEND);
	if (!n) goto error;
	n = mxmlNewText(n, 0, b->child->value.text.string);
	if (!n) goto error;

	b = mxmlFindElement(node, node, "complete_time", NULL, NULL, MXML_DESCEND);
	if (!b) goto error;
	n = mxmlFindElement(tree_m, tree_m, "CompleteTime", NULL, NULL, MXML_DESCEND);
	if (!n) goto error;
	n = mxmlNewText(n, 0,  b->child->value.text.string);
	if (!n) goto error;

	b = mxmlFindElement(node, node, "method_id", NULL, NULL, MXML_DESCEND);
	if (!b) goto error;
	*method_id = atoi(b->child->value.text.string);


	*msg_out = mxmlSaveAllocString(tree_m, xml_format_cb);
	mxmlDelete(tree_m);
	return 0;
error:
	mxmlDelete(tree_m);
	return -1;
}
예제 #5
0
파일: hpd_xml.c 프로젝트: Tibo-lg/HomePort
/**
 * Returns the entire xml device list
 *
 * @return The XML device list
 */ 
  char *
get_xml_device_list()
{

  char *return_value = mxmlSaveAllocString(service_xml_file->xml_tree, MXML_NO_CALLBACK);

  return return_value;

}
예제 #6
0
파일: hpd_xml.c 프로젝트: Tibo-lg/HomePort
/**
 * Extracts the service XML description given its internal structure
 *
 * @param _service_to_extract The Service that we want to extract
 *
 * @return The XML description of the service or NULL if failed
 */ 
  char *
extract_service_xml(Service *_service_to_extract)
{
  if(service_is_in_xml_file (_service_to_extract) == HPD_NO)
    return NULL;

  mxml_node_t *xml;
  xml = mxmlNewXML("1.0");

  mxml_node_t *new_service;
  mxml_node_t *new_device;
  mxml_node_t *new_parameter;

  new_service = mxmlNewElement(xml, "service");
  if(_service_to_extract->description != NULL) mxmlElementSetAttr(new_service, "desc", _service_to_extract->description);
  if(_service_to_extract->ID != NULL) mxmlElementSetAttr(new_service, "id", _service_to_extract->ID);
  mxmlElementSetAttr(new_service, "isActuator", _service_to_extract->isActuator ? "1" : "0");
  if(_service_to_extract->value_url != NULL) mxmlElementSetAttr(new_service, "value_url", _service_to_extract->value_url);
  if(_service_to_extract->type != NULL) mxmlElementSetAttr(new_service, "type", _service_to_extract->type);
  if(_service_to_extract->unit != NULL) mxmlElementSetAttr(new_service, "unit", _service_to_extract->unit);

  new_device = mxmlNewElement(new_service, "device");
  if(_service_to_extract->device->description != NULL) mxmlElementSetAttr(new_device, "desc", _service_to_extract->device->description);
  if(_service_to_extract->device->ID != NULL) mxmlElementSetAttr(new_device, "id", _service_to_extract->device->ID);
  if(_service_to_extract->device->vendorID != NULL) mxmlElementSetAttr(new_device, "vendorid", _service_to_extract->device->vendorID);
  if(_service_to_extract->device->productID != NULL) mxmlElementSetAttr(new_device, "productid", _service_to_extract->device->productID);
  if(_service_to_extract->device->version != NULL) mxmlElementSetAttr(new_device, "version", _service_to_extract->device->version);
  if(_service_to_extract->device->IP != NULL) mxmlElementSetAttr(new_device, "ip", _service_to_extract->device->IP);
  if(_service_to_extract->device->port != NULL) mxmlElementSetAttr(new_device, "port", _service_to_extract->device->port);
  if(_service_to_extract->device->location != NULL) mxmlElementSetAttr(new_device, "location", _service_to_extract->device->location);
  if(_service_to_extract->device->type != NULL) mxmlElementSetAttr(new_device, "type", _service_to_extract->device->type);

  Parameter *iterator = _service_to_extract->parameter;
  if(iterator != NULL)
  {
    new_parameter = mxmlNewElement(new_service, "parameter");
    if(iterator->ID != NULL) mxmlElementSetAttr(new_parameter, "id", iterator->ID);
    if(iterator->max != NULL) mxmlElementSetAttr(new_parameter, "max", iterator->max);
    if(iterator->min != NULL) mxmlElementSetAttr(new_parameter, "min", iterator->min);
    if(iterator->scale != NULL) mxmlElementSetAttr(new_parameter, "scale", iterator->scale);
    if(iterator->step != NULL) mxmlElementSetAttr(new_parameter, "step", iterator->step);
    if(iterator->type != NULL) mxmlElementSetAttr(new_parameter, "type", iterator->type);
    if(iterator->unit != NULL) mxmlElementSetAttr(new_parameter, "unit", iterator->unit);
    if(iterator->values != NULL) mxmlElementSetAttr(new_parameter, "values", iterator->values);
  }

  char* return_string = mxmlSaveAllocString(xml, MXML_NO_CALLBACK);

  mxmlDelete(xml);

  return return_string;
}
예제 #7
0
char *XMLwrapper::getXMLdata(){
    xml_k=0;
    ZERO(tabs,STACKSIZE+2);
    
    mxml_node_t *oldnode=node;
    
    node=info;
    //Info storing
    
    node=oldnode;
    char *xmldata=mxmlSaveAllocString(tree,XMLwrapper_whitespace_callback);

    return(xmldata);
};
예제 #8
0
const char*  set_keyvalue(const char* xmlstr, const char* catelog_name, const char* key_name, const char* value)
{
	if ((!catelog_name) || (!key_name) || (!value))
	{
		DbgPrint("get_keyvalue input parameter error");
		return (NULL);
	}

	mxml_node_t *xml;

	if (xmlstr == NULL)
	{
		xml = mxmlNewXML("1.0");
	}
	else
	{
		xml = mxmlLoadString(NULL, xmlstr, MXML_TEXT_CALLBACK);
	}

	if (xml == NULL)
	{
		DbgPrint("xml load err: %s", xmlstr);
		return (NULL);
	}

	mxml_node_t *catelog = mxmlFindElement(xml, xml, catelog_name, NULL, NULL, MXML_DESCEND);

	if (catelog == NULL)
	{
		catelog = mxmlNewElement(xml, catelog_name);
	}

	mxml_node_t *node = mxmlFindElement(catelog,catelog,key_name,NULL,NULL,MXML_DESCEND);
	if (node)
	{
		mxmlSetText(node, 0, value);
	}
	else
	{
		node = mxmlNewElement(catelog, key_name);
		mxmlNewText(node, 0, value);
	}

	mxmlSetWrapMargin(2);
	char* system_xmlstr = strdup_tls(mxmlSaveAllocString(xml, MXML_TEXT_CALLBACK));
	mxmlDelete(xml);

	return (system_xmlstr);
}
예제 #9
0
파일: mxml.c 프로젝트: pk2010/nft
struct nftnl_expr *nftnl_mxml_expr_parse(mxml_node_t *node,
        struct nftnl_parse_err *err,
        struct nftnl_set_list *set_list)
{
    mxml_node_t *tree;
    struct nftnl_expr *e;
    const char *expr_name;
    char *xml_text;
    uint32_t set_id;
    int ret;

    expr_name = mxmlElementGetAttr(node, "type");
    if (expr_name == NULL) {
        err->node_name = "type";
        err->error = NFTNL_PARSE_EMISSINGNODE;
        goto err;
    }

    e = nftnl_expr_alloc(expr_name);
    if (e == NULL)
        goto err;

    xml_text = mxmlSaveAllocString(node, MXML_NO_CALLBACK);
    if (xml_text == NULL)
        goto err_expr;

    tree = mxmlLoadString(NULL, xml_text, MXML_OPAQUE_CALLBACK);
    xfree(xml_text);

    if (tree == NULL)
        goto err_expr;

    ret = e->ops->xml_parse(e, tree, err);
    mxmlDelete(tree);

    if (set_list != NULL &&
            strcmp(expr_name, "lookup") == 0 &&
            nftnl_set_lookup_id(e, set_list, &set_id))
        nftnl_expr_set_u32(e, NFTNL_EXPR_LOOKUP_SET_ID, set_id);

    return ret < 0 ? NULL : e;
err_expr:
    nftnl_expr_free(e);
err:
    mxmlDelete(tree);
    errno = EINVAL;
    return NULL;
}
예제 #10
0
파일: hpd_xml.c 프로젝트: Tibo-lg/HomePort
/**
 * Returns an internal char* of a value under the form of :
 * "<?xml version="1.0" encoding="UTF-8"?><value timestamp = xxxxxx >desired_value</value>"
 *
 * @param value The string of the value desired
 *
 * @return Returns the char* corresponding
 */
  char * 
get_xml_value(char* value)
{
  mxml_node_t *xml;
  mxml_node_t *xml_value;

  xml = mxmlNewXML("1.0");
  xml_value = mxmlNewElement(xml, "value");
  mxmlElementSetAttr(xml_value, "timestamp", timestamp());
  mxmlNewText(xml_value, 0, value);

  char* return_value = mxmlSaveAllocString(xml, MXML_NO_CALLBACK);
  mxmlDelete(xml);

  return return_value;
}
예제 #11
0
std::unique_ptr<char, void(*)(void*)> getXML(lib::Span<const Driver * const> drivers, lib::Span<const GatorCpu> clusters)
{
    const auto xml = getTree(clusters);

    // Add dynamic events from the drivers
    mxml_node_t *events = mxmlFindElement(xml.get(), xml.get(), TAG_EVENTS, NULL, NULL, MXML_DESCEND);
    if (!events) {
        logg.logError("Unable to find <events> node in the events.xml, please ensure the first two lines of events XML are:\n"
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                "<events>");
        handleException();
    }
    for (const Driver *driver : drivers) {
        driver->writeEvents(events);
    }

    return {mxmlSaveAllocString(xml.get(), mxmlWhitespaceCB), &free};
}
예제 #12
0
char *EventsXML::getXML() {
	mxml_node_t *xml = getTree();

	// Add dynamic events from the drivers
	mxml_node_t *events = mxmlFindElement(xml, xml, "events", NULL, NULL, MXML_DESCEND);
	if (!events) {
		logg->logError("Unable to find <events> node in the events.xml, please ensure the first two lines of events XML are:\n"
			       "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
			       "<events>");
		handleException();
	}
	for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) {
		driver->writeEvents(events);
	}

	char *string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
	mxmlDelete(xml);

	return string;
}
예제 #13
0
void StreamlineSetup::sendCounters() {
	mxml_node_t *xml;
	mxml_node_t *counters;

	xml = mxmlNewXML("1.0");
	counters = mxmlNewElement(xml, "counters");
	int count = 0;
	for (Driver *driver = Driver::getHead(); driver != NULL; driver = driver->getNext()) {
		count += driver->writeCounters(counters);
	}

	if (count == 0) {
		logg.logError("No counters found, this could be because /dev/gator/events can not be read or because perf is not working correctly");
		handleException();
	}

	mxml_node_t *setup = mxmlNewElement(counters, "setup_warnings");
	mxmlNewText(setup, 0, logg.getSetup());

	if (gSessionData.mSharedData->mClustersAccurate) {
		for (int cluster = 0; cluster < gSessionData.mSharedData->mClusterCount; ++cluster) {
			mxml_node_t *node = mxmlNewElement(counters, "cluster");
			mxmlElementSetAttrf(node, "id", "%i", cluster);
			mxmlElementSetAttr(node, "name", gSessionData.mSharedData->mClusters[cluster]->getPmncName());
		}
		for (int cpu = 0; cpu < gSessionData.mCores; ++cpu) {
			if (gSessionData.mSharedData->mClusterIds[cpu] >= 0) {
				mxml_node_t *node = mxmlNewElement(counters, "cpu");
				mxmlElementSetAttrf(node, "id", "%i", cpu);
				mxmlElementSetAttrf(node, "cluster", "%i", gSessionData.mSharedData->mClusterIds[cpu]);
			}
		}
	}

	char* string = mxmlSaveAllocString(xml, mxmlWhitespaceCB);
	mxmlDelete(xml);

	sendString(string, RESPONSE_XML);
	free(string);
}
예제 #14
0
static struct evbuffer *
mxml_to_evbuf(mxml_node_t *tree)
{
  struct evbuffer *evbuf;
  char *xml;
  int ret;

  evbuf = evbuffer_new();
  if (!evbuf)
    {
      DPRINTF(E_LOG, L_RSP, "Could not create evbuffer for RSP reply\n");

      return NULL;
    }

  xml = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
  if (!xml)
    {
      DPRINTF(E_LOG, L_RSP, "Could not finalize RSP reply\n");

      evbuffer_free(evbuf);
      return NULL;
    }

  ret = evbuffer_add(evbuf, xml, strlen(xml));
  free(xml);
  if (ret < 0)
    {
      DPRINTF(E_LOG, L_RSP, "Could not load evbuffer for RSP reply\n");

      evbuffer_free(evbuf);
      return NULL;
    }

  return evbuf;
}
예제 #15
0
    char *complete_part_xml;
    aos_string_t xml_doc;
    mxml_node_t *doc;
    mxml_node_t *root_node;
    oss_complete_part_content_t *content;

    doc = mxmlNewXML("1.0");
    root_node = mxmlNewElement(doc, "CompleteMultipartUpload");
    aos_list_for_each_entry(content, bc, node) {
        mxml_node_t *part_node = mxmlNewElement(root_node, "Part");
        mxml_node_t *part_number_node = mxmlNewElement(part_node, "PartNumber");
        mxmlNewText(part_number_node, 0, content->part_number.data);
        mxml_node_t *etag_node = mxmlNewElement(part_node, "ETag");
        mxmlNewText(etag_node, 0, content->etag.data);
    }
    xml_buff = mxmlSaveAllocString(doc, MXML_NO_CALLBACK);
    aos_str_set(&xml_doc, xml_buff);
    complete_part_xml = aos_pstrdup(p, &xml_doc);

    free(xml_buff);
    mxmlDelete(doc);

    return complete_part_xml;
}

void build_complete_multipart_upload_body(aos_pool_t *p, aos_list_t *part_list, aos_list_t *body)
{
    char *complete_multipart_upload_xml;
    aos_buf_t *b;
    
    complete_multipart_upload_xml = build_complete_multipart_upload_xml(p, part_list);
예제 #16
0
int parse_opt(int argc, char *argv[])
{
    char cmd[4] = {0};
    char key[128] = {0};
    char val[128] = {0};
    char file[128] = {0};
    int  num = 0;


    int flag = 0;
    int c;
    while (1) {
        int option_index = 0;
        /* 
         * name;     has_arg;    flag; val;
         * {"quiet", 0,          0,      0}
         *
         * ATTENTION:
         *   when has_arg set to 1, a ':' add in "hc:k:f:v:" accordingly
         *   on cmdline: -q a  <==> -qa
         */
        static struct option long_options[] = {
            {"help" , 0, 0, 'h'},
            {"inner", 0, 0, 'i'},
            {"cmd"  , 1, 0, 'c'},
            {"file" , 1, 0, 'f'},
            {"key"  , 1, 0, 'k'},
            {"val"  , 1, 0, 'v'},
            {"num"  , 1, 0, 'n'},
            {0      , 0, 0, 0  }
        };

        c = getopt_long(argc, argv, "hic:k:f:v:n:", long_options, &option_index);
        if (c == -1)
            break;

        switch (c) {
        case 'c':
            flag |= FLAG_CMD;
            strncpy(cmd, optarg, 1);
            
            if (cmd[0] != 'a' && cmd[0] != 'd' && cmd[0] != 'w' && cmd[0] != 'r') {
                pritnt_usage(argv, __LINE__);
            }
            break;

        case 'f':
            flag |= FLAG_FILE;
            strncpy(file, optarg, sizeof(file));
            break;

        case 'k':
            flag |= FLAG_KEY;
            strncpy(key, optarg, sizeof(key));
            break;

        case 'v':
            flag |= FLAG_VAL;
            strncpy(val, optarg, sizeof(val));
            break;

        case 'n':
            flag |= FLAG_NUM;
            num = atoi(optarg);
            break;

        case 'i':
            flag |= FLAG_INNER;
            break;

        case 'h':
            pritnt_usage(argv, 0);
        default:
            pritnt_usage(argv, __LINE__);
        }
    }

    if (!(flag & FLAG_CMD)) {
        pritnt_usage(argv, __LINE__);
    }

    if ((flag & FLAG_NUM) && num < 1) {
        pritnt_usage(argv, __LINE__);
    }

    // xml-file needed
    if (optind == (argc-1)) {
        if (0 != access(argv[optind], R_OK)) {
            eprintf("file %s is not readable\n", argv[optind]);
            exit(1);
        }
    } else {
        fprintf(stderr, "optind:%d argc-1:%d\n", optind, argc-1);
        pritnt_usage(argv, __LINE__);
    }

    int ret;
    const char *xmlfile = argv[optind];
	FILE *fp_xml = fopen(xmlfile, "r");
    return_val_if_fail(fp_xml != NULL, FAILURE);

    mxml_node_t *tree = NULL;

    if (cmd[0] == 'r') {
        tree = mxmlLoadFile(NULL, fp_xml, MXML_OPAQUE_CALLBACK);   
        return_val_if_fail(tree != NULL, FAILURE);
    } else {
        tree = mxmlLoadFile(NULL, fp_xml, MXML_TEXT_CALLBACK);   
        return_val_if_fail(tree != NULL, FAILURE);
    }

    fclose(fp_xml);

    if (flag & FLAG_FILE) {
        int match;
        FILE *fp;
        char *line = NULL;
        size_t len = 0;

        fp = fopen(file, "r");
        if (fp == NULL) {
            exit(1);
        }

        while ((getline(&line, &len, fp)) != -1) {
            match = sscanf(line, "%d%s%*[ ]%[^\n]", &num, key, val);
            if ((match == 3 && (cmd[0] == 'a' || cmd[0] == 'w')) || 
                (match == 2 && (cmd[0] == 'd' || cmd[0] == 'r'))) {
                ret = node_process(cmd[0], tree, key, val, num);
                if (ret != 0) {
                    pritnt_usage(argv, ret);
                }
            } else {
                eprintf("Retrieved error format line %s\n", line);
            }
        }

        free(line);
        fclose(fp);
    } else {
        ret = node_process(cmd[0], tree, key, val, num);
        if (ret != 0) {
            pritnt_usage(argv, ret);
        }
    }

    if (cmd[0] != 'r') {
        if (flag&FLAG_INNER) {
            FILE *fp = fopen(argv[optind], "w");
            mxmlSaveFile(tree, fp, xml_format_write);
        } else {
            char *ptr = mxmlSaveAllocString(tree, xml_format_write);
            printf("%s\n", ptr);
        }
    }

    return 0;
}
예제 #17
0
int main_2(int argc, const char * argv[])
{
    mxml_node_t * xml; /*<?xml ... ?>*/
    mxml_node_t * data; /*<data>*/
    mxml_node_t * node; /*<node>*/
    mxml_node_t * group; /*group*/
/*xml*/
    xml = mxmlNewXML("1.0");
/*data*/
    data = mxmlNewElement(xml, "data");
    /*3个node*/
    node = mxmlNewElement(data, "node");
    mxmlNewText(node, 0, "val1");
    
    node = mxmlNewElement(data, "node");
    mxmlNewText(node, 0, "val2");
    
    node = mxmlNewElement(data, "node");
    mxmlNewText(node, 0, "val3");
    /*group*/
    group = mxmlNewElement(data, "group");
    /*group 下的三个node*/
    node = mxmlNewElement(group, "node");
    mxmlNewText(node, 0, "val4");
    
    node = mxmlNewElement(group, "node");
    mxmlNewText(node, 0, "val5");
    
    node = mxmlNewElement(group, "node");
    mxmlNewText(node, 0, "val6");
    
    /*2个node*/
    node = mxmlNewElement(data, "node");
    mxmlNewText(node, 0, "val7");
    
    node = mxmlNewElement(data, "node");
    mxmlNewText(node, 0, "val8");
    
/*自动折行控制------似乎不顶用!!!!!!*/
    mxmlSetWrapMargin(100);/*设置100列折行*/
    mxmlSetWrapMargin(0);/*取消自动折行*/
    
/*保存*/
    /*保存到文件*/
    FILE * fp;
    fp = fopen("/Users/zhangliang/Desktop/Project/C/Mini-XML/Mini-XML/testxml2.xml", "w");
    mxmlSaveFile(xml, fp, MXML_NO_CALLBACK);
    fclose(fp);
    
    
    /*保存到字符串中*/
    char buffer[4096];
    char * ptr;
    
    mxmlSaveString(xml, buffer, sizeof(buffer), MXML_NO_CALLBACK);
    
    ptr = mxmlSaveAllocString(xml, MXML_NO_CALLBACK);
    
    printf("buffer: %s\n", buffer);
    printf("alloc : %s\n", ptr);
    free(ptr);
    
    
    
    return 0;
}