用Java解析YAML前端问题

时间:2012-08-02 02:05:32

标签: java parsing yaml jekyll snakeyaml

我必须在java中解析YAML Front Matter,如jekyll,所以对源代码和found this进行了解析,但我无法理解它(我不太了解红宝石)。

所以我的问题是,如何在java中解析YAML Front Matter

我的classpath中有snakeyaml,我将从markdown文件中解析YAML Front Matter,我使用pegdown

3 个答案:

答案 0 :(得分:7)

void parse(Reader r) throws IOException {
    BufferedReader br = new BufferedReader(r);

    // detect YAML front matter
    String line = br.readLine();
    while (line.isEmpty()) line = br.readLine();
    if (!line.matches("[-]{3,}")) { // use at least three dashes
        throw new IllegalArgumentException("No YAML Front Matter");
    }
    final String delimiter = line;

    // scan YAML front matter
    StringBuilder sb = new StringBuilder();
    line = br.readLine();
    while (!line.equals(delimiter)) {
        sb.append(line);
        sb.append("\n");
        line = br.readLine();
    }

    // parse data
    parseYamlFrontMatter(sb.toString());
    parseMarkdownOrWhatever(br);
}

要获得Reader,您可能需要FileReaderInputStreamReader

答案 1 :(得分:2)

好的,因为您的评论澄清了您的问题:

yaml前面的内容是行内部的三个破折号(---)。 YAML前面的内容总是在文件的开头。

所以你只需要解析文件并从文件的开头提取YAML Front Matter。您可以使用自动机或RegEx解析它。这完全取决于你。它总是以相同的方式构建:

---
some YAML here
---
Markdown / textile / HTML contents of file

答案 2 :(得分:2)

如果您只是对前面的事情感兴趣,可以使用SnakeYaml的loadAll方法:

Object yamlFrontMatter(Yaml yaml, InputStream in) {
    return yaml.loadAll().iterator().next();
}

SnakeYaml只会读取第一个yaml结构(前面的内容)并忽略尾随的非yaml文本。

不幸的是,SnakeYaml没有优雅的方式输出剩余的文本,所以如果你想同时解析前面的事物和身体,这种方法没有优势: - (