进行 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
添加硬编码标签作为字符串?
你不需要,尤其是当你的结构不复杂并且你不想不惜一切代价依赖外部库依赖时。
但是,即使在最简单的情况下(仅与格式相关,不涉及名称空间、模式等),库也会为您提供:
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输出
我编写了一个工具,目前该工具的输出格式为 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
添加硬编码标签作为字符串?
你不需要,尤其是当你的结构不复杂并且你不想不惜一切代价依赖外部库依赖时。
但是,即使在最简单的情况下(仅与格式相关,不涉及名称空间、模式等),库也会为您提供:
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输出