2012-04-02 2 views
3

Мне нужно распечатать XML, который я манипулировал с помощью groovy и поддерживал порядок атрибутов. Мне все равно, использует ли он 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) 

Вот 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> 

После того как я распечатать измененный файл, хотя, атрибуты интерфейса и реализации перепутаны.

Я уже знаю, о чем вы думаете: порядок атрибутов xml не имеет значения. Ну, мое требование от моего босса - сохранить порядок атрибутов b/c, который был таким образом на века. На самом деле я должен был написать этот парсер с помощью Java/DOM4J, и я пытался показать своей команде что-то новое. Любая помощь будет оценена по достоинству. Благодаря!

+0

У вас есть пример xml, который вы можете вставить в вопрос, который показывает проблему? –

+0

добавил образец xml - спасибо – jeff

ответ

2

Я не думаю, что это возможно без написания собственного кода для вывода XML.

Парсер SAX не имеет понятия упорядочения атрибутов (AFAIK), и поэтому заказ будет потерян до того, как XmlSlurper даже увидит данные ... Я нашел 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

+1

Думаю, что я нашел способ использовать 'XmlParser' ... Тестирование сейчас ... –

+0

@jeff обновил мой ответ :-) –

Смежные вопросы