Разбиение генерации StreamingMarkupBuilder на более мелкие методы - PullRequest
0 голосов
/ 07 июня 2019

У меня есть код, который генерирует 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>

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Я нашел решение, в котором я могу передать весь объект и вызвать набор методов.Я использовал делегат, чтобы получить область действия замыканий в методе createJobXml, в котором построен xml.

def createJobXml (JobInfo jobInfo) {{

StreamingMarkupBuilder builder = new StreamingMarkupBuilder()
buildJob.delegate =delegate
buildServer.delegate =delegate
builder.bind{
          jobs{
             buildServer(jobInfo.server)
             buildJob(jobInfo.job)
          }
   }
}

def buildJob = { Job j ->
  job {
     etc.
  }

}

 def buildServer = { Server s ->
   server {
     etc.
  }

}
0 голосов
/ 07 июня 2019

Самый простой способ - разбить создание XML, используя отдельные методы для каждого типа данных.

def markupBuilder = new StreamingMarkupBuilder()
def xml = markupBuilder.bind { builder ->
 client {
  name 'mrhaki'
  buildAddress builder, 'Main St.', 42, 'Ducktown'
 }
}

def buildAddress(builder, streetName, number, city) {
 builder.address {
  houseNumber number
  buildCity builder, city
 }
}

def buildCity(builder, city) {
 builder.city city
}

Методы, конечно, могут быть разбросаны по нескольким классам.

Полный пример и пояснения: на groovy-goodness

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