Есть ли способ печатать XML с вертикальным выравниванием? - PullRequest
4 голосов
/ 16 июня 2011

У меня есть файл конфигурации, который имеет некоторый XML-код:

<Presidents>
  <President first="George" last="Washington" number="1" year="1789" />
  <President first="John" last="Adams" number="2" year="1797" />
</Presidents>

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

<Presidents>
  <President first="George" last="Washington" number="1" year="1789" />
  <President first="John"   last="Adams"      number="2" year="1797" />
</Presidents>

Этот стиль форматирования зависит от наличия списка элементов с одинаковыми атрибутами, поэтому он, вероятно, не может быть применен в общем случае к любому XML-документу, однако это общий стиль для файлов конфигурации.Я прочитал справочные страницы для xmllint и xmlstarlet и не могу найти ссылки на такую ​​функцию.

1 Ответ

2 голосов
/ 22 июня 2011

Я создал следующий скрипт для выравнивания столбцов. Сначала я передаю свою мысль XML xmllint, а затем через следующее:

#!/usr/bin/env ruby
#
# vertically aligns columns

def print_buf(b)
  max_lengths={}
  max_lengths.default=0

  b.each do |line|
    for i in (0..line.size() - 1)
      d = line[i]
      s = d.size()
      if s > max_lengths[i] then
        max_lengths[i] = s
      end
    end
  end

  b.each do |line|
    for i in (0..line.size() - 1)
      print line[i], ' ' * (max_lengths[i] - line[i].size())
    end
  end

end

cols=0
buf=[]

ARGF.each do |line|
  columns=line.split(/( |\r\n|\n|\r)(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/m)
  if columns.size != cols then
    print_buf(buf) if !buf.empty?
    buf=[]
  end
  buf << columns
  cols = columns.size
end

print_buf(buf)
...