Groovy:按ID分组xml段

时间:2017-07-08 15:58:53

标签: xml groovy

我需要创建一个额外的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是否可以这样做。我试过下面的链接,但不知道它们如何适用于我的情况。 Grouping and sorting nested collections in Groovy

1 个答案:

答案 0 :(得分:0)

假设您的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('<group/>')但分组似乎工作正常。

如果您的mySegment元素不是root的子元素,则可以使用root.'**'.findAll{el -> el.name() == 'mySegment'}找到它们,以便使用

进行分组
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)}