Groovy脚本为开始日期和结束日期之间的每个日期打破有效负载[关闭]

shyt4zoc  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(40)

**已关闭。**此问题正在寻求书籍、工具、软件库等的建议。它不符合Stack Overflow guidelines。它目前不接受回答。

我们不允许问题寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答问题。
上个月关门了。
Improve this question
我有一个这样的输入:

<root>
  <results>
    <loc>Loc 10</loc>
    <loc_name>Loc Desc10</loc_name>
    <points>3</points>
    <StartDate>2023-09-11T22:39:40Z</StartDate>
    <EndDate>2023-09-13T22:45:36.437000Z</EndDate>
  </results>
  <results>
    <loc>Loc 11</loc>
    <loc_name>Loc Desc 11</loc_name>
    <points>4</points>
    <StartDate>2023-09-16T22:39:40Z</StartDate>
    <EndDate>2023-09-18T22:45:36.437000Z</EndDate>
  </results>
</root>

我想为开始和结束日期之间的每一天复制数据。我们需要一个类似于以下的输出:

<root>
  <results>
    <loc>Loc 10</loc>
    <loc_name>Loc Desc10</loc_name>
    <points>3</points>
    <Date>2023-09-11T22:39:40Z</Date>
  </results>
  <results>
    <loc>Loc 10</loc>
    <loc_name>Loc Desc10</loc_name>
    <points>3</points>
    <Date>2023-09-12T22:39:40Z</Date>
  </results>
  <results>
    <loc>Loc 10</loc>
    <loc_name>Loc Desc10</loc_name>
    <points>3</points>
    <Date>2023-09-13T22:39:40Z</Date>
  </results>
  <results>
    <loc>Loc 11</loc>
    <loc_name>Loc Desc11</loc_name>
    <point>4</points>
    <Date>2023-09-16T22:39:40Z</Date>
  </results>
  <results>
    <loc>Loc 11</loc>
    <loc_name>Loc Desc11</loc_name>
    <point>4</points>
    <Date>2023-09-17T22:39:40Z</Date>
  </results>
  <results>
    <loc>Loc 11</loc>
    <loc_name>Loc Desc11</loc_name>
    <point>4</points>
    <Date>2023-09-18T22:39:40Z</Date>
  </results>
</root>

我们如何在Groovy中做到这一点?
我无法找到任何关于如何在Groovy中循环负载并创建新负载的示例

q7solyqu

q7solyqu1#

下面是一个快速脚本,它可以实现您正在寻找的功能:

import java.text.*
import groovy.xml.*

def text = '''
<root>
  <results>
    <loc>Loc 10</loc>
    <loc_name>Loc Desc10</loc_name>
    <points>3</points>
    <StartDate>2023-09-11T22:39:40Z</StartDate>
    <EndDate>2023-09-13T22:45:36.437000Z</EndDate>
  </results>
  <results>
    <loc>Loc 11</loc>
    <loc_name>Loc Desc 11</loc_name>
    <points>4</points>
    <StartDate>2023-09-16T22:39:40Z</StartDate>
    <EndDate>2023-09-18T22:45:36.437000Z</EndDate>
  </results>
</root>
'''

def xml = new XmlSlurper().parseText( text )
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX")
SimpleDateFormat endParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")
def output = new XmlParser().parseText("<root/>")

xml.results.each { resXml ->
   Date startDate = parser.parse( resXml.StartDate.text() )
   Date endDate = endParser.parse( resXml.EndDate.text() )
   
   Date currentDate = new Date( startDate.time )
   while( currentDate < endDate ) {
       Node resultsNode = output.appendNode( new QName("results"), [:] )
       resXml.children().findAll { child -> child.name() != "StartDate" && child.name() != "EndDate" }.each { child ->
          resultsNode.appendNode( new QName(child.name()), [:], child.text() )
       }
       resultsNode.appendNode(new QName("Date"), [:], parser.format( currentDate ))
       currentDate = currentDate + 1
   }
}
println( XmlUtil.serialize(output ) )

我注意到了一些事情,应该解释一下。StartDate节点和EndDate节点具有不同的日期格式。感觉很奇怪。如果您控制这个XML的生成,您可能需要清理它。
诀窍在于parseText返回一个GPathResult,它允许你跨xml节点执行查询(比如xml.results.each跨根元素下的节点执行查询)。你还可以访问groovy的集合方法(如findAllcollecteach等)。因此,用于将节点从输入文档复制到输出的循环使用findAll来过滤所有不是StartDateEndDate的节点,使用each进行迭代。

相关问题