У меня есть код, который генерирует XML для различных заданий.Он генерирует много разметки, поэтому я использую StreamingMarkupBuilder.Я могу успешно сгенерировать весь XML как один гигантский XML-документ.Однако есть много повторяющихся частей для заданий, поэтому я хочу разбить их на методы, каждый из которых будет генерировать некоторую часть xml.Я пытался вызывать методы, но они просто помещали имена методов в виде тегов XML в выводе.Вот документ, который я пытаюсь создать.В нем есть еще много разделов, но я для краткости удалил их.
<jobs xmnlns:"https://www.monitoring.silver.star.com/mngs/v1/ngmon">
<server>
<detail>crcscanner1</detail>
<ip> 220.10.12.72</ip>
<state>active</state>
</server>
<job>
<name>pcf-1</name>
<stage>1</stage>
<duration> 3 hours</duration>
<submittedByprocess-ngm</submittedByProcess>
<jobDetail>
<printing>
<card>10X6</card>
<graphicSize>4X6</graphicSize>
<scaleFactor> 1.5</scaleFactor>
<material>paper<material>
</printing>
</jobDetail>
</job>
<job>
<name>pcf-2</name>
<stage>2</stage>
<duration> 3 hours</duration>
<submittedBy>-ngm</submittedBy>
<jobDetail>
<printing>
<card>10X6</card>
<graphicSize>4X6</graphicSize>
<scaleFactor> 1.5</scaleFactor>
<material>paper<material>
</printing>
</jobDetail>
</job>
....
</jobs>
Я использовал этот код для генерации xml, который работает нормально.Тем не менее, будет очень трудно читать, когда весь код XML включен как один гигантский код XML.Я хочу разбить его на те, где я передал классы Server.java, Job.java методам.Вот XML или его часть, поскольку документ огромен.
StreamingMakupBuilder builder = new StreamingMakupBuilder()
markupBuilder.encoding = 'UTF-8'
String orderXml = markupBuilder.bind {builder ->
mkp.xmlDeclaration()
jobs(xmlns:"https://www.monitoring.silver.star.com/mngs/v1/ngmon) {
server{
detail('crcscanner1')
ip('220.10.12.72')
state('ACTIVE')
}
job{
name('pcf-1')
stage('1')
duration('3 hours')
submittedBy('ngm</submittedByProcess')
}
jobDetail{
printing{
card('10X6')
graphicSize('4X10')
scaleFactor('1.5')
materia('paper')
}
buildJob(Job b) // This printed <buildJob></buildJob>
///... repeat the jobs
}
}
Я создал этот образец в качестве теста, поскольку исходный документ XML слишком велик.Тем не менее, он основан на попытке передать объект в метод.Этот пример дает представление о том, что я пытаюсь сделать.
import groovy.xml.*
def markupBuilder = new StreamingMarkupBuilder()
ManKing mowgli = new ManKing()
def xml = markupBuilder.bind { builder ->
client {
name 'mrhaki'
buildAddress builder, 'Main St.', 42, 'Ducktown'
buildManKing mowgli
}
}
def buildAddress(StreamingMarkupBuilder builder, streetName, number, city) {
builder.address {
houseNumber number
buildCity builder, city
}
}
def buildCity( StreamingMarkupBuilder builder, city) {
builder.city city
}
def buildManKing( StreamingMarkupBuilder builder, ManKing manKing){
builder.manKing{
name manKing.name
jungleFriend manKing.jungleFriend
}
}
class ManKing {
String name
String jungleFriend
}
Вот результат включения этой части.Вы можете видеть, что вместо этого используются имя метода и объект, поэтому предлагаемое решение не работает для передачи объектов так, как в примере:
Result:
<client><name>mrhaki</name><buildAddress>Ducktown</buildAddress>
<buildManKing>ManKing@3eee45b2</buildManKing></client>