将 StreamingMarkupBuilder xml 生成分解为更小的方法
Breaking StreamingMarkupBuilder xml generation into smaller methods
我有一些代码可以为各种作业生成 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>
最简单的方法是通过为每种数据类型使用单独的方法来分解您的 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
}
这些方法当然可以分散在几个 类。
完整的例子和解释是at groovy-goodness
我找到了一个可以传递整个对象并调用一组方法的解决方案。我使用了一个委托,在构建 xml 的 createJobXml 方法中获取闭包的范围。
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.
}
}
我有一些代码可以为各种作业生成 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>
最简单的方法是通过为每种数据类型使用单独的方法来分解您的 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
}
这些方法当然可以分散在几个 类。
完整的例子和解释是at groovy-goodness
我找到了一个可以传递整个对象并调用一组方法的解决方案。我使用了一个委托,在构建 xml 的 createJobXml 方法中获取闭包的范围。
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.
}
}