我正在尝试使用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)
我想打印每个密钥令牌的值标记。 所有帮助赞赏。 :)
答案 0 :(得分:0)
这个库提供了类似SAX的API来解析yaml,对于整个块的存储键值,并在块结束时打印它们,你可以使用堆栈。首先,您看到YAML_BLOCK_SEQUENCE_START_TOKEN
,之后将YAML_KEY_TOKEN
和YAML_KEY_VALUE
存储到堆栈中,看到YAML_BLOCK_END_TOKEN
块已结束并且您可以打印堆栈。为了在您的打印中有正确的意图,您可以使用变量来存储打印时的深度。