Rexml - красивая печать со встроенным текстом и отступом дочерних тегов

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


person Max Williams    schedule 19.01.2011    source источник


Ответы (1)


Вам нужно установить для свойства 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)
person Dylan Markow    schedule 19.01.2011
comment
Спасибо, dmarkow, это было то же самое, что я понял после публикации (см. Мое редактирование). - person Max Williams; 21.01.2011
comment
Обратите внимание, что вам также необходимо установить formatter.width = <very high number>, если вы хотите избежать переноса более длинных строк текстовых узлов. - person Alexander Klimetschek; 20.10.2011