制作XML输出

时间:2016-03-27 22:02:33

标签: xml ocaml

我编写了一个工具,此时工具的输出格式为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添加硬编码标签为字符串吗?

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

1 个答案:

答案 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。紧凑/缩进输出