首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将StreamingMarkupBuilder xml生成分解为更小的方法

将StreamingMarkupBuilder xml生成分解为更小的方法
EN

Stack Overflow用户
提问于 2019-06-07 15:51:08
回答 2查看 84关注 0票数 0

我有一些代码,可以为各种工作生成xml。它会生成很多标记,所以我使用StreamingMarkupBuilder。我能够成功地将整个xml生成为一个巨大的xml文档。但是,这些作业有很多重复的部分,所以我想把它分解成几个方法,每个方法都将生成xml的某些部分。我尝试过调用方法,但这只是将方法名作为xml标记放在输出中。这是我试图生成的文档。它有更多的部分,但为了简洁,我删除了它们。

代码语言:javascript
复制
<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,或者是其中的一部分,因为文档很大。

代码语言:javascript
复制
 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文档太大。但是,它是基于尝试将对象传递给方法的。这个示例给出了我想要做什么的一个概念。

代码语言:javascript
复制
    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 
}

以下是包含该部分的结果。您可以看到,使用的是方法名称和对象,因此建议的解决方案不适用于以示例的方式传递对象:

代码语言:javascript
复制
 Result:   


<client><name>mrhaki</name><buildAddress>Ducktown</buildAddress>

      <buildManKing>ManKing@3eee45b2</buildManKing></client>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-09 04:37:46

我找到了一个解决方案,在这个方案中,我能够传递整个对象并调用一组方法。我使用了一个委托来获取构建xml的createJobXml方法中闭包的作用域。

def createJobXml(JobInfo jobInfo){ {

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-06-07 16:25:42

最简单的方法是分解XML创建,对每种数据类型使用不同的方法。

代码语言:javascript
复制
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
}

当然,这些方法可以分散在几个类中。

完整的示例和解释是at groovy-goodness

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56490138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档