当前位置: 首页 > 知识库问答 >
问题:

Groovy:按ID对xml段分组

百里丁雨
2023-03-14

我需要创建一个额外的XML标记,比如myGroup&因为我需要创建来自输入的每个ID_Number的组。

以下是我的输入:

<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>1</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>2</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>2</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>3</ID_Number>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>3</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>

我想根据ID_Numbers创建组,以便所有具有公共ID的mySegments都位于myGroup标记下,如下所示:

<myGroup>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>1</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>

</myGroup>
<myGroup>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>2</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>2</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
</myGroup>
<myGroup>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>3</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>3</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<myGroup>

我知道使用XSLT可以很容易地完成,但我必须使用Groovy来实现这一点。请告知这是否可以由Groovy完成。我尝试了以下链接,但不确定他们如何可以应用到我的情况。Groovy中嵌套集合的分组和排序

共有1个答案

司寇研
2023-03-14

假设mySegment元素有一个公共根元素,下面是一个示例:

def xml = '''
<Root>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>1</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>2</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>2</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>3</ID_Number>
</mySegment>
<mySegment>
<Field1>AB</Field1>
<Field2>AB</Field2>
<Field3>AB</Field3>
<Field4>AB</Field4>
<ID_Number>3</ID_Number>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
<child>
<Field5>AB</Field5>
<Field6>AB</Field6>
<Field7>AB</Field7>
</child>
</mySegment>
</Root>
'''

def slurper = new XmlSlurper()
def root = slurper.parseText(xml)
def newRoot = slurper.parseText('<Root/>')
root.mySegment.groupBy{s -> s.ID_Number.text()}.each{key, value -> def group = slurper.parseText('<group/>'); value.each{v -> group.appendNode(v)}; newRoot.appendNode(group)}
groovy.xml.XmlUtil.serialize newRoot

我想有更好的方法来创建新元素,而不是这样做,例如slurper.parsetext(' '),但是分组似乎可以很好地工作。

如果您的MySegment元素不是根的子元素,您可以使用根找到它们。“**”.findall{el->el.name()==“My Segment”}以便使用

root.'**'.findAll{el -> el.name() == 'mySegment'}.groupBy{s -> s.ID_Number.text()}.each{key, value -> def group = slurper.parseText('<group/>'); value.each{v -> group.appendNode(v)}; newRoot.appendNode(group)}
 类似资料:
  • 我有两个RDDs。在Spark scala中,如果event1001RDD和event2009RDD具有相同的id,我该如何连接它们? Val事件1001RDD:模式RDD=[事件类型,id,位置,日期1] val event 2009 rdd:schemaRDD =[事件类型,id,日期1,日期2] 预期结果将是:(唯一)(按 id 排序) [事件类型,ID,1001 的位置,1001 的日期1

  • 我正在和Kafka经纪人联系阿帕奇·Flink。 我随机收到了以下消息: 消息(时间戳=[…],索引=1,someData=[…]) 消息(时间戳=[…],索引=2,someData=[…]) 消息(时间戳=[…],索引=3,某些数据=[…]) 消息(时间戳=[…],索引=2,someData=[…]) 消息(时间戳=[…],索引=3,某些数据=[…]) 消息(时间戳=[…],索引=1,someD

  • Groovy XML-RPC 提供了在 Groovy 编程语言中实现 XML-RPC 服务器端和客户端的简单方法。该项目同时也支持 Jabber-RPC。 示例代码 import groovy.net.xmlrpc.* import java.net.ServerSocket def server = new XMLRPCServer() server.echo = {return it} def

  • 问题内容: 我的索引具有如下所述的数据。 如何在Java中编写Elasticsearch查询。如果我按日期搜索2016-13-01T12:00:00我希望看到每个groupId的最新版本,其indexDate小于或等于搜索日期? 预期输出: 我没有在Elasticsearch的日期字段中看到max函数来实现这一点。 问题答案: 我将首先进行汇总,然后使用子汇总,以降序排序并返回该存储区的第一个文档

  • 我有一个带有分段按钮的选项卡栏导航,它还包含一个卡片布局。一切正常。然而,我试图让我的分段按钮集中在屏幕上。我不想让它伸展。我已经包含了主要视图,并将所有代码放在SenchaFIDLE上

  • 嗨,我必须读取一个xml文件,在代码的一部分中有一些字段标签,名称如示例中所述 我只想读取名为“link\u pdf”的字段 如果我用这个密码 我可以读取值,但在某些情况下这不是一个好的工作,如何通过字段名访问值? 不是工作