本文目录一览:
c语言如何解析xml并将所有内容存入数组
/* 前段时间恰好做过类似的东西,代码可以给你参考下。
* Xml配置见最后
*/
typedef struct SrcFileFmt
{
int ColID;
char ColCode[64]; /* 字段英文名称 */
char ColName[128]; /* 字段中文名称*/
char ColType[20]; /* 字段类型(包含长度) */
char ColComment[128]; /* 字段描述 */
}SrcFileFmt;
int main(int argc, char **argv)
{
SrcFileFmt SrcFileFmt[128];
int iNum = -1;
if ( 2 argc )
{
printf("Usage: %s SrcXmlFile\n", argv[0]);
return -1;
}
iNum = parseSourceCfg(SrcCfgFile, SrcFileFmt);
if (iNum == -1)
{
return -1;
}
return 0;
}
/* 调用此函数后,xml文件的内容会被存储到结构体数组SrcFileFmt srcfilefmt[]中
* 此函数依赖于libxml2-2.9.2.tar.xz
*/
int parseSourceCfg(char *FileName, SrcFileFmt srcfilefmt[])
{ /* 解析源文件xml,FileName 为源xml文件名 */
xmlDocPtr doc;
xmlNodePtr cur, root;
char sFileName[64] = {'\0'};
int cnt = 0;
if (FileName == NULL)
{
return -1;
}
sprintf(sFileName, "%s.xml", FileName);
doc = xmlParseFile(sFileName);
if (doc == NULL)
{
return -1;
}
root = xmlDocGetRootElement(doc);
if (root == NULL) {
xmlFreeDoc(doc);
return(-1);
}
if (xmlStrcmp(root-name, (const xmlChar *) "SrcRoot"))
{
xmlFreeDoc(doc);
return -1;
}
cur = root-xmlChildrenNode;
while (cur != NULL)
{
if ((!xmlStrcmp(cur-name, (const xmlChar *)"Column")))
{
xmlChar *key;
xmlNodePtr cur_sub = cur;
cur_sub = cur_sub-xmlChildrenNode;
while (cur_sub != NULL)
{
if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColID"))) {
key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);
killblank((char*)key);
srcfilefmt[cnt].ColID = atoi((char*)key);
xmlFree(key);
}
if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColCode"))) {
key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColCode, (char*)key);
xmlFree(key);
}
else if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColName"))) {
key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColName, (char*)key);
xmlFree(key);
}
else if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColType"))) {
key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColType, (char*)key);
xmlFree(key);
}
else if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColComment"))) {
key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColComment, (char*)key);
xmlFree(key);
}
cur_sub = cur_sub-next;
}
cnt++;
}
cur = cur-next;
}
xmlFreeDoc(doc);
return cnt;
}
SrcRoot
Column
ColID1/ColID
ColCodekmh/ColCode
ColName字段1/ColName
ColTypeVARCHAR(11)/ColType
/Column
Column
ColID2/ColID
ColCodedfkmh/ColCode
ColName字段2/ColName
ColTypeVARCHAR(11)/ColType
/Column
Column
ColID3/ColID
ColCodehbh/ColCode
ColName字段3/ColName
ColTypeINTEGER(10)/ColType
/Column
/SrcRoot
C语言 格式符解析
printf("a=%4d,b=%6.2f,c=%c,d=%s",12,3.456,‘A',“hello");
%4d
对应后面第一个数值12,以整型占4个字符打印输出,
%6.2f
以实型打印输出,格式输出为占6个字符,打印小数点后两位。。四舍五入为3.46,
把3.456改为3.454,看看
%c打印字符型
%s字符串型
跪求:如何正确地选用数据类型?(C语言)
char是固定长度字符类型,varchar是可变长度的字符类型,在检索时char列会删除尾部的空格,MyISAM存储引擎建议使用固定长度的数据列替代可变长度的数据列,MEMORY存储引擎目前都使用固定长度的数据行存储。InnoDB存储引擎建议使用varchar。
保存较大文本时通常会使用text或者blob。二者的差别是blob能用来保存二进制数据比如照片,而text只能保存字符数据。text和blob值会引起一些性能问题,特别是在执行了大量的删除操作时。可以使用合成的索引来提高大文本字段(BLOB 或TEXT)的查询性能。
扩展资料:
注意事项:
在MySQL中支持的5个主要整数类型是TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。这些类型在很大程度上是相同的,只有存储的值的大小是不相同的。
使用一个宽度指示器不会影响字段的大小和可以存储的值的范围。万一需要对一个字段存储一个超出许可范围的数字,MySQL会根据允许范围最接近的一端截短后再进行存储。还有一个比较特别的地方是MySQL会在不合规定的值插入表前自动修改为0。
参考资料来源:百度百科-数据类型