2012-04-02 46 views
3

我需要打印使用groovy操作並維護屬性順序的XML。我不在乎它是使用XmlParser/XmlNodePrinter還是XmlSlurper/StreamingMarkupBuilder。我當前的代碼如下:groovy - xml - 保留屬性順序

File file = new File('input.xml') 
def root = new XmlSlurper().parse(file) 

def admins = root.user.findAll {[email protected]().equals("admin")} 
admins.each { admin -> 
    admin.permission.findAll { [email protected]().equals("RoleManagement") 
    }.each { 
    [email protected] = "AdminRoleManagement" 
    } 
} 

def smb = new StreamingMarkupBuilder().bind { mkp.yield root } 
new File('output.xml').text = groovy.xml.XmlUtil.serialize(smb) 

這是我打印出修改後的文件之後被送入程序

<users> 
    <user username="test1234" role="admin"> 
    <permission interface="com.test.RoleManagement" implementation="com.test.AdminRoleManagement"/> 
    <permission interface="com.test.UserAdministration" implementation="com.test.UserAdministrationImpl"/> 
    </user> 
</users> 

的XML,雖然接口和實現屬性被顛倒。

我已經知道你在想什麼:xml屬性順序無關緊要。那麼,我的老闆的要求就是保持屬性順序B/C已經這麼多年了。實際上我應該使用Java/DOM4J來編寫這個解析器,我試圖向我的團隊展示一些新的東西。任何幫助,將不勝感激。謝謝!

+0

您是否有一些xml示例可以粘貼到展示問題的問題中? – 2012-04-02 15:00:40

+0

添加了一些示例xml - 謝謝 – jeff 2012-04-02 15:06:30

回答

2

如果不編寫自己的代碼來輸出XML,我不認爲這是可能的。

SAX解析器沒有屬性排序(AFAIK)的概念,所以在看到數據之前,訂單將會丟失,然後我發現一個thread on the groovy-user list有一個討論,但它似乎沒有拿出任何解決方案...

認爲有可能與XmlParser,因爲這似乎維持秩序:

def xml = '''<users> 
      | <user username="test1234" role="admin"> 
      | <permission interface="com.test.RoleManagement" implementation="com.test.AdminRoleManagement"/> 
      | <permission interface="com.test.UserAdministration" implementation="com.test.UserAdministrationImpl"/> 
      | </user> 
      |</users>'''.stripMargin() 

def root = new XmlParser().parseText(xml) 

def admins = root.user.findAll { [email protected] == "admin" } 

admins.each { admin -> 
    admin.permission.findAll { 
    [email protected] == "com.test.RoleManagement" 
    }.each { 
    [email protected] = "AdminRoleManagement" 
    } 
} 

String output = new StringWriter().with { sw -> 
    new XmlNodePrinter(new PrintWriter(sw)).print(root) 
    sw.toString() 
} 
println output 

,打印:

<users> 
    <user username="test1234" role="admin"> 
    <permission interface="com.test.RoleManagement" implementation="AdminRoleManagement"/> 
    <permission interface="com.test.UserAdministration" implementation="com.test.UserAdministrationImpl"/> 
    </user> 
</users> 

乍一看似乎是對的?

+0

是的,我看到了。也許我希望有一種方法可以在另一面(打印時)格式化數據。感謝您的評論。 – jeff 2012-04-02 15:12:24

+1

想想我可能已經找到了一種使用'XmlParser'的方法...現在測試出來... – 2012-04-02 15:13:13

+0

@jeff更新了我的答案:-) – 2012-04-02 15:15:51