Ruby: libxml-ruby и добавление красиво отформатированных одноуровневых узлов - PullRequest
1 голос
/ 02 апреля 2009

Учитывая мой существующий XML (test.xml):

<root>
  <element>
    <child id="1" />
    <child id="2" />
    <child id="3" />
  </element>
</root>

И мой рубиновый код:

require 'rubygems'
require 'xml'

parser = XML::Parser.file("test.xml")
doc = parser.parse

target = doc.find('/*/element')
target << child = XML::Node.new('child')
child['id'] = '4'

XML.indent_tree_output = true
doc.save(filename, :indent => true, :encoding => XML::Encoding::UTF_8)

Моя проблема в том, что он форматирует вывод следующим образом:

<root>
  <element>
    <child id="1" />
    <child id="2" />
    <child id="3" />
  <child id="4" /></element>
</root>

... с последующими добавлениями, выглядящими так:

<root>
  <element>
    <child id="1" />
    <child id="2" />
    <child id="3" />
  <child id="4" /><child id="5" /><child id="6" /></element>
</root>

Что я ХОЧУ это:

<root>
  <element>
    <child id="1" />
    <child id="2" />
    <child id="3" />
    <child id="4" />
    <child id="5" />
    <child id="6" />
  </element>
</root>

... но как мне его получить?

Ответы [ 2 ]

2 голосов
/ 12 мая 2009

заменить
parser = XML::Parser.file("test.xml")

с
parser = XML::Parser.file("test.xml", :options => XML::Parser::Options::NOBLANKS )

это поможет

0 голосов
/ 02 апреля 2009

Если вы используете document.save, убедитесь, что для параметра indent установлено значение true, также убедитесь, что установлен XML.indent_tree_output. Примерно так:

XML.indent_tree_output = true
doc.save(filename, :indent => true, :encoding => XML::Encoding::UTF_8)

Rubyforge не работает для меня, поэтому я не могу проверить это в документации, но я думаю, что оба должны быть установлены в true для отступов и новых строк для работы.

...