groovy - xml - сохранить порядок атрибутов - PullRequest
3 голосов
/ 02 апреля 2012

Мне нужно напечатать XML, которым я манипулировал, используя groovy, и поддерживать порядок атрибутов.Мне все равно, если он использует XmlParser / XmlNodePrinter или XmlSlurper / StreamingMarkupBuilder.Мой текущий код выглядит следующим образом:

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

def admins = root.user.findAll {it.@role.text().equals("admin")}
admins.each { admin ->
  admin.permission.findAll { it.@interface.text().equals("RoleManagement") 
  }.each {
    it.@implementation = "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 не имеет значения.Что ж, мое требование от моего босса - сохранить порядок атрибутов, потому что так было всегда.На самом деле я должен был написать этот парсер с использованием Java / DOM4J и пытался показать моей команде что-то новое.Любая помощь будет оценена.Спасибо!

1 Ответ

2 голосов
/ 02 апреля 2012

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

У синтаксического анализатора SAX нет концепции упорядочения атрибутов (AFAIK), поэтому порядок будет потерян до того, как XmlSlurper даже увидит данные ... Я нашел поток в списке пользователей groovy который обсуждает это, но, похоже, не предлагает никаких решений ...

Я думаю это возможно с 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 { it.@role == "admin" }

admins.each { admin ->
  admin.permission.findAll {
    it.@interface == "com.test.RoleManagement" 
  }.each {
    it.@implementation = "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>

Что на первый взгляд кажется правильным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...