Использование строковых переменных внутри StreamingMarkupBuilder(). Bind{} в Groovy

Для кода ниже:

def writer = new StringWriter()
writer = new StreamingMarkupBuilder().bind {
Project(){MyTag('Help Me')}
}  
println(writer.toString()) 

the output would be: <Project><MyTag>Help Me</MyTag></Project>

Теперь, если у меня есть "MyTag('Help Me')" в приведенном выше коде в виде строки var, и я хочу использовать, как показано ниже

def teststring = "MyTag('Help Me')"
def writer = new StringWriter()
writer = new StreamingMarkupBuilder().bind {
Project(){out<<teststring}
}
println(writer.toString()) 

the output am getting is: MyTag('Help Me')<Project></Project>
but am expecting: <Project><MyTag>Help Me</MyTag></Project>

Я новичок в groovy, кто-нибудь поможет мне с правильной реализацией или найдет ошибку для вышеупомянутого случая? Пожалуйста, дайте мне знать, если мне пришлось использовать другой класс, кроме StreamingMarkupBuilder и XmlMarkupBuilder? Обратите внимание, что в реальном сценарии для меня текстовая переменная содержит гораздо больше вложенных дочерних узлов.

1 ответ

Решение

Вы могли бы сделать что-то вроде этого; Оберните строку узла в { -> } и оцените его как Закрытие, затем установите делегата и вызовите закрытие:

import groovy.xml.*

def nodes = '''MyTag( attr:'help me' ) {
              |    AnotherTag( 'Help me!' )
              |}'''.stripMargin()

println XmlUtil.serialize( new StreamingMarkupBuilder().bind {
    Project {
        c = Eval.me( "{ -> $nodes }" )
        c.delegate = delegate
        c()
    }
} )

Какие отпечатки:

<?xml version="1.0" encoding="UTF-8"?><Project>
  <MyTag attr="help me">
    <AnotherTag>Help me!</AnotherTag>
  </MyTag>
</Project>

Тем не менее, вы должны быть осторожны, как будто это nodes Строка приходит извне вашей системы, ее можно использовать для выполнения любого кода, который в нее помещен.

Если вы получаете узлы в строке, почему бы не заставить их писать XML вместо этого и сохранить вашу работу?;-)

Другие вопросы по тегам