我编写了一个工具,此时工具的输出格式为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
添加硬编码标签为字符串吗?
答案 0 :(得分:0)
您没有,特别是如果您的结构不复杂并且您不想不惜一切代价依赖外部库依赖项。
但是,即使在最简单的情况下(仅与格式相关,不涉及名称空间,模式等),库将为您提供:
<强> 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。紧凑/缩进输出