在c中使用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(!

我正在尝试使用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(!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是的。您能举个例子吗?我在使用深度时不知何故未能做到这一点: