1

我正在尝试使用带有缩进的 OCaml 输出 XML:

<document>
      <tag>
            <undertag/>
            <undertag/>
      </tag>
      <tag>
            <undertag/>
      </tag>
</document>

我正在尝试使用格式,但我无法获得预期的结果......

Format.printf "@.";
  Format.printf
    "@[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @[<hv>@[<hv 2>(------------------------------------------------------------------------\
     @]@,)@]@]@,)@]@]@,)@]";
  Format.printf "@."

是否输出:

(------------------------------------------------------------------------
  (------------------------------------------------------------------------
    (------------------------------------------------------------------------
    )
  )
)

fp "@.";
fp "@[<hv>@[<hv 2><document>";
fp "@[<hv>@[<hv 2><cfun>";
fp "@[<hv>@[<hv 2><cst/>@]@]";
fp "@]@,</cfun>@]";
fp "@]@,</document>@]";
fp "@.";

哪里fp = Format.printf输出<document><cfun><cst/></cfun></document>(都在一行中!)。

我应该怎么做 ?

谢谢。

4

4 回答 4

3

使用xmlm的示例(有意程序化,使用适合您情况的辅助函数):

let out = Xmlm.make_output ~indent:(Some 4) (`Channel stdout) in
Xmlm.output out (`Dtd None);
Xmlm.output out (`El_start (("", "document"), []));
Xmlm.output out (`El_start (("", "tag"), []));
Xmlm.output out (`El_start (("", "undertag"), [(("", "id"), "1")]));
Xmlm.output out (`Data "data");
Xmlm.output out `El_end;
Xmlm.output out (`El_start (("", "undertag"), [(("", "id"), "2")]));
Xmlm.output out `El_end;
Xmlm.output out `El_end;
Xmlm.output out `El_end

注意缩进参数。

输出:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <tag>
        <undertag id="1">
            data
        </undertag>
        <undertag id="2"/>
    </tag>
</document>
于 2013-10-26T22:29:55.833 回答
2

一位朋友向我展示了一种使用垂直框的方法。以下输出就好了@[<v 0>@,<xml>@,<document>@[<v 2>@,<tag>@[<v 2>@,<el>@,<el>@,<el>@]@,</tag>@]@,</document>@]

希望这能有所帮助。

于 2013-10-27T23:08:30.907 回答
2

您可以使用 Format 模块执行以下操作:

假设您有这种 XML 类型,

type xml =
  | Tag of string * xml list
  | String of string

let tag name body = Tag (name, body)

这是一个漂亮的打印机:

let format, format_list = Format.(fprintf, pp_print_list)

let rec format_xml f = function
  | Tag (name, body) ->
      let format_body = format_list format_xml in
      format f "@[<hv 3><%s>@,%a@;<0 -3></%s>@]" name format_body body name
  | String text -> format f "%s" text

这是一个与您类似的测试用例:

let () =
  Format.set_margin 30;

  let xml = tag "document" [
    tag "tag" [tag "undertag" [String "hello"]];
    tag "tag" [tag "undertag" []];
  ] in
  format_xml Format.std_formatter xml

它打印以下内容:

<document>
   <tag>
      <undertag>
         hello
      </undertag>
   </tag>
   <tag>
      <undertag></undertag>
   </tag>
</document>

我的另一个答案对所使用的格式字符串有更多解释:Boxes and XML in Format module

于 2016-05-13T08:12:27.303 回答
0

您可以使用@\n强制换行符。For @,or@布局将尝试尽可能多地适合一行 - 但是一旦它中断一行,它将中断同一打印框中的后续行。尝试一下。请参阅文档指南

于 2013-10-27T14:24:27.047 回答