Rexml - красивая печать со встроенным текстом и отступом дочерних тегов - PullRequest
9 голосов
/ 19 января 2011

Я создаю документ XML с помощью REXML и хочу выводить в текст определенным образом. Документ представляет собой список тегов 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>

Я попытался передать функции .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>

Это нежелательно, потому что оно вставило пробелы в содержимое тегов, в которых есть только текст. т.е. содержимое тега Name теперь равно "\ n inst_50 \ n" или что-то в этом роде. Это взорвет приложение, которое читает XML.

Кто-нибудь знает, как я могу отформатировать выходной файл так, как я этого хочу?

Благодарен за любой совет, макс.

РЕДАКТИРОВАТЬ - Я только что нашел ответ на ruby-forum, через другое сообщение StackOverflow: 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,"")}

Это дает такие результаты, как

<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>

Нет дополнительной строки между тегами CuePoint, но это хорошо для меня. Я оставляю этот вопрос здесь на случай, если кто-нибудь еще наткнется на него.

1 Ответ

18 голосов
/ 19 января 2011

Вам необходимо установить для свойства compact форматера значение true, но вы можете сделать это только сначала установив отдельный объект форматера, а затем используя его для написания, а не вызова собственного метода записи документа.

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