minixml创建与解析XML

来源:互联网 发布:诊股最准的软件 编辑:程序博客网 时间:2024/04/29 10:09

转自: http://blog.sina.com.cn/s/blog_4ab2ba570100iria.html

以下是对minixml分析后做出的例子。希望对大家有用。至于minixml库,大家可google查找。
 <?xml version="1.0" ?> 
 <schedule>
       <record>
              <program_content>....1.</program_content> 
              <from>.....2...</from> 
              <to>.....3..</to> 
              <mode>....4.</mode> 
              <frequency>...5.</frequency> 
              <pre_set_from>......</pre_set_from> 
     </record>
     <record>
             <program_content>...7..</program_content> 
             <from>....8....</from> 
             <to>-------</to> 
             <mode>-----</mode> 
             <frequency>-----</frequency> 
             <pre_set_from>-----</pre_set_from> 
     </record>
     <space>
           <FHD>-----</FHD> 
           <SHD>-----</SHD> 
           <MAC>-----</MAC> 
     </space>
</schedule>
#include"mxml.h"
#inclide<string.h>
#include<stdlib.h>
#include<stdio.h>




const char *
whitespace_cb(mxml_node_t *node,
              int         where)
{
mxml_node_t *parent;
int level;
const char *name;
static const char *tabs = "\t\t\t\t\t\t\t\t";
name = node->value.element.name;
if (!strcmp(name, "schedule") || !strcmp(name, "record") || !strcmp(name, "space"))
{
if (!strcmp(name, "schedule")||where == MXML_WS_BEFORE_OPEN || where == MXML_WS_AFTER_CLOSE)
return("\n");
else(!strcmp(name, "record") || !strcmp(name, "space") ||where == MXML_WS_BEFORE_OPEN)
return("\t");
else(!strcmp(name, "record") || !strcmp(name, "space") ||where == MXML_WS_AFTER_CLOSE)
return("\n");
}
else if (!strcmp(name, "dd") || !strcmp(name, "dt") || !strcmp(name, "li"))
{
if (where == MXML_WS_BEFORE_OPEN)
return ("\t");
else if (where == MXML_WS_AFTER_CLOSE)
return ("\n");
}
else if (!strncmp(name, "?xml", 4))
{
if (where == MXML_WS_AFTER_OPEN)
return ("\n");
else
return (NULL);
}
else if (where == MXML_WS_BEFORE_OPEN ||
((!strcmp(name, "choice") || !strcmp(name, "option")) &&
where == MXML_WS_BEFORE_CLOSE))
{
for (level = -1, parent = node->parent;
parent;level ++, parent = parent->parent);
if (level > 8)
level = 8;
else if (level < 0)
level = 0;
return (tabs + 8 - level);
}
else if (where == MXML_WS_AFTER_CLOSE ||
((!strcmp(name, "group") || !strcmp(name, "option") ||
!strcmp(name, "choice")) &&
where == MXML_WS_AFTER_OPEN))
return ("\n");
else if (where == MXML_WS_AFTER_OPEN && !node->child)
return ("\n");
return (NULL);
}

int main()
{
    mxml_node_t *xml;    
    mxml_node_t *schedule;  
    mxml_node_t *record;  
    mxml_node_t *space;  
    mxml_node_t *node;
    xml = mxmlNewXML("1.0");
    schedule = mxmlNewElement(xml, "schedule");
for(i=0;i<2;i++)
{
        record = mxmlNewElement(schedule, "record");

            node = mxmlNewElement(record, "program_content");
            mxmlNewText(node, 0, "val4");
            node = mxmlNewElement(record, "from");
            mxmlNewText(node, 0, "val5");
            node = mxmlNewElement(record, "to");
            mxmlNewText(node, 0, "val6");
            node = mxmlNewElement(record, "mode");
            mxmlNewText(node, 0, "val6");
            node = mxmlNewElement(record, "frequency");
            mxmlNewText(node, 0, "val6");
            node = mxmlNewElement(record, "pre_set_from");
            mxmlNewText(node, 0, "val6");
}
       space = mxmlNewElement(schedule, "space");

            node = mxmlNewElement(space, "FHD");
            mxmlNewText(node, 0, "val4");
            node = mxmlNewElement(space, "SHD");
            mxmlNewText(node, 0, "val5");
            node = mxmlNewElement(space, "MAC");
            mxmlNewText(node, 0, mac_address());
            
            FILE *fp;
            fp = fopen("filename.xml", "w");
            mxmlSaveFile(xml, fp,whitespace_cb );
            fclose(fp);
            mxmlDelete(xml);
}
///////////////// ///////////////////////

////////////////////////////////////////////
parse XML example
  <?xml version="1.0" encoding="gb2312" ?> 
 <note>
  <id>5000</id> 
  <password>FE-D0-18-00</password> 
</note>
#include"mxml.h"
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    mxml_node_t *tree,node;

    fp = fopen("filename.xml", "r");
    tree = mxmlLoadFile(NULL, fp,MXML_TEXT_CALLBACK);
    fclose(fp);

    mxml_node_t *id,*password;
    
    node = mxmlFindElement(tree, tree, "note",
                           NULL, NULL,
                           MXML_DESCEND);
    id = mxmlFindElement(node, tree, "id",
                           NULL, NULL,
                           MXML_NO_DESCEND);
    printf("[%s}\n",id->child->value.text.string); 
    
    password = mxmlFindElement(node, tree, "password",
                           NULL, NULL,
                           MXML_NO_DESCEND);                          

     printf("[%s]\n",password->child->value.text.string);
  

    mxmlDelete(tree);

}

原创粉丝点击