在c中使用yaml解析配置文件
我正在尝试使用yaml解析配置文件。 我可以使用以下代码成功解析整个文件在c中使用yaml解析配置文件,c,yaml,C,Yaml,我正在尝试使用yaml解析配置文件。 我可以使用以下代码成功解析整个文件 #include <stdio.h> #include <yaml.h> int main(void) { FILE *fh = fopen("config/public.yaml", "r"); yaml_parser_t parser; yaml_token_t token; /* new variable */ /* Initialize parser */ if(!
#include <stdio.h>
#include <yaml.h>
int main(void)
{
FILE *fh = fopen("config/public.yaml", "r");
yaml_parser_t parser;
yaml_token_t token; /* new variable */
/* Initialize parser */
if(!yaml_parser_initialize(&parser))
fputs("Failed to initialize parser!\n", stderr);
if(fh == NULL)
fputs("Failed to open file!\n", stderr);
/* Set input file */
yaml_parser_set_input_file(&parser, fh);
/* BEGIN new code */
do {
yaml_parser_scan(&parser, &token);
switch(token.type)
{
/* Stream start/end */
case YAML_STREAM_START_TOKEN: puts("STREAM START"); break;
case YAML_STREAM_END_TOKEN: puts("STREAM END"); break;
/* Token types (read before actual token) */
case YAML_KEY_TOKEN: printf("(Key token) "); break;
case YAML_VALUE_TOKEN: printf("(Value token) "); break;
/* Block delimeters */
case YAML_BLOCK_SEQUENCE_START_TOKEN: puts("<b>Start Block (Sequence) </b>"); break;
case YAML_BLOCK_ENTRY_TOKEN: puts("<b>Start Block (Entry)</b>"); break;
case YAML_BLOCK_END_TOKEN: puts("<b>End block</b>"); break;
/* Data */
case YAML_BLOCK_MAPPING_START_TOKEN: puts("[Block mapping]"); break;
case YAML_SCALAR_TOKEN: printf("scalar %s \n", token.data.scalar.value); break;
/* Others */
default:
printf("Got token of type %d\n", token.type);
}
if(token.type != YAML_STREAM_END_TOKEN)
yaml_token_delete(&token);
} while(token.type != YAML_STREAM_END_TOKEN);
yaml_token_delete(&token);
/* END new code */
/* Cleanup */
yaml_parser_delete(&parser);
fclose(fh);
return 0;
}
#包括
#包括
内部主(空)
{
文件*fh=fopen(“config/public.yaml”,“r”);
yaml_解析器_t解析器;
yaml_token_t token;/*新变量*/
/*初始化解析器*/
if(!yaml_解析器_初始化(&parser))
fputs(“未能初始化解析器!\n”,stderr);
如果(fh==NULL)
fputs(“无法打开文件!\n”,标准文件);
/*设置输入文件*/
yaml_解析器_集_输入文件(&parser,fh);
/*开始新代码*/
做{
yaml_解析器_扫描(&解析器和令牌);
开关(token.type)
{
/*流开始/结束*/
case YAML_STREAM_START_令牌:put(“STREAM START”);break;
case YAML_STREAM_END_TOKEN:put(“STREAM END”);break;
/*令牌类型(在实际令牌之前读取)*/
case YAML_KEY_TOKEN:printf(“(KEY TOKEN)”);break;
case YAML_VALUE_TOKEN:printf(“(VALUE TOKEN)”);break;
/*块状测厚仪*/
case YAML_BLOCK_SEQUENCE_START_TOKEN:put(“START BLOCK(SEQUENCE)”);break;
case YAML_BLOCK_ENTRY_TOKEN:put(“起始块(条目)”);break;
case YAML_BLOCK_END_TOKEN:put(“END BLOCK”);break;
/*资料*/
case YAML_BLOCK_MAPPING_START_令牌:put(“[BLOCK MAPPING]”);break;
case YAML\u SCALAR\u标记:printf(“标量%s\n”,TOKEN.data.SCALAR.value);break;
/*其他*/
违约:
printf(“获取类型为%d\n的令牌”,token.type);
}
if(token.type!=YAML\u STREAM\u END\u token)
yaml_令牌_删除(&T令牌);
}while(token.type!=YAML\u STREAM\u END\u token);
yaml_令牌_删除(&T令牌);
/*结束新代码*/
/*清理*/
yaml_解析器_delete(&parser);
fclose(fh);
返回0;
}
但我想打印整个块的值。例如,如果我有以下块:
force_tx_margin:(键标记)
(键标记)默认值:0x0(值标记)
(密钥令牌)efuse\u位\u偏移量:2564(值令牌)
(键标记)nwl_位偏移量:484(值标记)
(键标记)宽度:1(值标记)
我想打印每个密钥令牌的值令牌。
感谢所有帮助。:) 这个库为解析yaml提供了类似SAX的API,用于存储整个块的键值,并在块结束后打印它们,您可以使用堆栈。首先看到
YAML\u块\u序列\u开始\u标记
,然后将YAML\u键\u标记
和YAML\u键\u值
存储到堆栈中,然后看到YAML\u块\u结束\u标记
块已结束,可以打印堆栈。为了在打印时达到正确的目的,您可以使用变量来存储打印时所处的深度。您想存储整个块的键值,并在块结束时打印它们吗?@ParhamAlvani是的。您能举个例子吗?我在使用深度时不知何故未能做到这一点: