Как обновить XML с помощью Groovy XML Slurper? - PullRequest
4 голосов
/ 04 ноября 2010

Я прочитал статью в Groovy Codehaus о Обновлении XML с помощью XmlSlurper , это приводит меня к следующему вопросу.Представьте, что у нас есть входной XML, структурированный как следующий:

<customer>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
</customer>

Можно ли изменить XML, не зная его конкретной структуры?Конкретно: у нас есть ссылка на узел address, и мы хотим умножить его в 3 раза, не зная никаких подробностей?

address.multiply(3)

Результат должен выглядеть следующим образом:

<customer>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
</customer>

возможно с appendNode, но мне не хватает метода клонирования для узлов в groovy.Есть ли решение для достижения этой цели?

Ответы [ 2 ]

9 голосов
/ 04 ноября 2010

Единственный способ, которым я могу думать в настоящее время для узлов клонирования, - это сериализовать их в текст и анализировать их как новые биты xml

Вроде так:

import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil

def xml = """
<customer>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
</customer>
"""

def root = new XmlSlurper().parseText( xml )
2.times {
  String addressXml = new StreamingMarkupBuilder().bindNode( root.address )
  clonedAddress = new XmlSlurper().parseText( addressXml )
  root.appendNode( clonedAddress )
}

println XmlUtil.serialize( root )

Который распечатывает:

<?xml version="1.0" encoding="UTF-8"?>
<customer>
  <address>
    <street/>
    <city/>
    <postalcode/>
  </address>
  <address>
    <street/>
    <city/>
    <postalcode/>
  </address>
  <address>
    <street/>
    <city/>
    <postalcode/>
  </address>
</customer>

Вероятно, есть более аккуратный способ сделать это ... но в данный момент мой разум пуст ...

1 голос
/ 05 ноября 2011

GPathResult.replaceBody() у меня работает. Пример:

http://www.javamonamour.org/2011/11/groovy-modifying-xml-with-xmlslurper.html

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