Опускать пустые элементы с Groovy StreamingMarkupBuilder - PullRequest
0 голосов
/ 22 ноября 2011

Groovy's MarkupBuilder имеет omitNullAttributes и omitEmptyAttributes. Но StreamingMarkupBuilder нет.
У меня есть такой тег <foo />

Могу ли я исключить их из окончательного вывода?

P.S. Можно ли как-нибудь использовать трюк из поста Опустить пустые атрибуты с помощью groovy DOMBuilder ?

UPDATE: Пример XML

<A>
<Header><ID>1234</ID></Header>
<Body>
<item>
<id>001</id>
<foo />
</item>
</Body>
</A>

1 Ответ

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

Правильно, поэтому из комментариев, похоже, что вы пытаетесь удалить пустые элементы , не пустые атрибуты ...

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

Как в этом примере:

def xml = new StringWriter().with { sw ->
  new groovy.xml.MarkupBuilder( sw ).with { mb ->
    a {
      b( 'tim' )
      foo()
    }
    sw.toString()
  }
}

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

def emptykids = parser.depthFirst().findAll { it.children().size() == 0 }

emptykids.each {
  parser.remove( it )
}

new XmlNodePrinter().print( parser )

Однако,если вы не хотите добавлять пустые элементы в ваш XML при использовании StreamingMarkupBuilder, я не знаю, как это сделать.Я думаю, вы могли бы повторно реализовать сам класс , чтобы справиться с этим, но кроме этого, вы застряли ...

Однако следует сказать, что ни один из двух атрибутов выуказание на вопрос заставит MarkupBuilder сделать это либо.Он прекратит добавлять пустые атрибуты , но добавит пустые элементы

Теперь у нас есть пример для работы:

Попробуйте это:

def xml = '''|<A>
             |<Header><ID>1234</ID></Header>
             |<Body>
             |<item>
             |<id>001</id>
             |<foo />
             |</item>
             |</Body>
             |</A>'''.stripMargin()

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

parser.depthFirst().each { 
  if( it.children().size() == 0 ) {
    it.parent().remove( it )
  }
}

new XmlNodePrinter().print( parser )
...