Rexml - 漂亮的打印文本内联和子标签缩进

Max*_*ams 9 ruby pretty-print rexml

我正在使用REXML构建一个xml文档,并希望以特定方式输出到文本.doc是一个CuePoint标签列表,我用Element.new和add_element生成的那些标签都拼凑成一行如下:( stackoverflow在这里将它们分成两行,但想象下面的全部是一条线):

<CuePoint><Time>15359</Time><Type>event</Type><Name>inst_50</Name></CuePoint><CuePoint><Time>16359</Time><Type>event</Type><Name>inst_50</Name></CuePoint>

当我将它们保存到文件时,我希望它们看起来像这样:

<CuePoint>
  <Time>15359</Time>
  <Type>event</Type>
  <Name>inst_50</Name>
</CuePoint>

<CuePoint>
  <Time>16359</Time>
  <Type>event</Type>
  <Name>inst_50</Name>
</CuePoint>
Run Code Online (Sandbox Code Playgroud)

我尝试将.write函数传递给值2,以缩进它们:这会产生以下结果:

xml.write($stdout, 2) 产生

<CuePoint>
  <Time>
    15359
  </Time>
  <Type>
    event
  </Type>
  <Name>
    inst_50
  </Name>
</CuePoint>
<CuePoint>
  <Time>
    16359
  </Time>
  <Type>
    event
  </Type>
  <Name>
    inst_50
  </Name>
</CuePoint>
Run Code Online (Sandbox Code Playgroud)

这是不需要的,因为它已经将空白插入到只有文本的标签内容中.即Name标签的内容现在是"\n inst_50 \n"或其他东西.这将会破坏读取xml的应用程序.

有谁知道我怎么能按照我想要的方式格式化输出文件?

感谢任何建议,最多

编辑 - 我刚刚通过另一个StackOverflow帖子在ruby-forum上找到答案:http://www.ruby-forum.com/topic/195353

  formatter = REXML::Formatters::Pretty.new
  formatter.compact = true
  File.open(@xml_file,"w"){|file| file.puts formatter.write(xml.root,"")}
Run Code Online (Sandbox Code Playgroud)

这会产生类似的结果

<CuePoint>
  <Time>33997</Time>
  <Type>event</Type>
  <Name>inst_45_off</Name>
</CuePoint>
<CuePoint>
  <Time>34080</Time>
  <Type>event</Type>
  <Name>inst_45</Name>
</CuePoint>
Run Code Online (Sandbox Code Playgroud)

CuePoint标签之间没有额外的界限,但这对我来说很好.我将这个问题留在这里以防万一其他人偶然发现它.

Dyl*_*kow 18

您需要将formatter的compact属性设置为true,但是您只能通过先设置一个单独的formatter对象,然后使用它来进行编写而不是调用文档自己的write方法来实现.

formatter = REXML::Formatters::Pretty.new(2)
formatter.compact = true # This is the magic line that does what you need!
formatter.write(xml, $stdout)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果要避免包含更长的文本节点行,还必须设置`formatter.width = <very high number>`. (2认同)