进行 XML 输出

Make XML output

我编写了一个工具,目前该工具的输出格式为 text。例如,这里是打印函数:

(* in Shelf.ml *)
let print (chan: out_channel) (x: t) : unit =
  Printf.fprintf chan "Shelf:";
  List.iter (Book.print chan "%a\n") x

(* in Book.ml *)
let print (chan: out_channel) (x: t) : unit =
  Printf.fprintf chan "Book: %s, %d, %s" x.name x.year x.abstract

这是一个输出示例 text:

Shelf:
Book: LOTR, 1954, begin end
Book: The Hobbit, 1937, nice book

现在我决定也输出XML格式。我想,这样做的好处是可以与其他将我的输出作为输入的工具进行更好的通信。例如,我可能需要将我的输出显示为网页;或者某些 GUI 可能会采用我的输出并做出更好的布局。

因此 XML 的输出示例如下所示:

<shelf>
    <book name="LOTR">
        <year>1954</year>
        <abstract>begin end</abstract>
    </book>
    <book name="The Hobbit">
        <year>1937</year>
        <abstract>nice book</abstract>
    </book>
</shelf>

我的问题是,我应该如何开发 OCaml 程序来制作这种 XML 输出?例如,我是否应该向每个模块 print_xml 添加硬编码标签作为字符串?

人们将我指向 Xmlm and Markup。我应该使用这些模块而不是硬编码我的字符串标签吗?使用这些模块有什么好处?

你不需要,尤其是当你的结构不复杂并且你不想不惜一切代价依赖外部库依赖时。

但是,即使在最简单的情况下(仅与格式相关,不涉及名称空间、模式等),库也会为您提供:

1.自动标签关闭

Printf.fprintf "<tagname>%s</tagname>" x

以及

print_string "<foo>"
...
print_string "</foo>"

看起来不对,而且容易出错。

out `El_start tag
...
out `El_end

好多了:)

另外你可能会想要

<tag/>

而不是

<tag></tag>

2。漂亮打印的自动缩进

3。 Compact/indented输出