2011-06-16 81 views
4

我有有一些XML像一個配置文件:有沒有辦法用垂直對齊來打印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文檔,然而,它是配置文件的常用樣式。我已閱讀手冊頁xmllintxmlstarlet我找不到任何對此功能的引用。

回答

2

我創建了以下腳本來對齊列。我首先通過我的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)