【问题标题】:config file parsing using yaml in c在c中使用yaml解析配置文件
【发布时间】:2017-11-17 13:34:41
【问题描述】:

我正在尝试使用 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;
}

但我想打印整个块的值。例如,如果我有以下块:

force_tx_margin: (key token) (key token) default_value: 0x0 (value token) (key token) efuse_bit_offset: 2564 (value token) (key token) nwl_bit_offset: 484 (value token) (key token) width: 1 (value token)

我想打印每个键标记的值标记。 所有帮助表示赞赏。 :)

【问题讨论】:

  • 你想存储整个块的键值并在块结束时打印它们?
  • @ParhamAlvani 是的,完全正确..

标签: c yaml


【解决方案1】:

这个库提供了类似 SAX 的 API 来解析 yaml,用于存储整个块的键值并在块结束时打印它们,您可以使用堆栈。首先您看到YAML_BLOCK_SEQUENCE_START_TOKEN,然后将YAML_KEY_TOKENYAML_KEY_VALUE 存储到堆栈中,在您看到YAML_BLOCK_END_TOKEN 块已经结束并且您可以打印堆栈之后。为了正确打印您的意图,您可以使用变量来存储您在打印时所处的深度。

【讨论】:

  • 你能举个例子吗?我在使用深度时不知何故未能这样做:
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2020-07-18
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多