【问题标题】:Groovy: group xml segments by IDGroovy:按 ID 对 xml 段进行分组
【发布时间】:2017-12-12 18:31:59
【问题描述】:

我需要创建一个额外的 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

【问题讨论】:

  • 我从未使用过 Groovy,但作为 Java 平台的脚本语言,您不能只使用 Java 类/库来进行 XSLT 处理,例如 Sun/Oracle JRE 中内置的 Xalan 或 Saxon 9,在 Maven 上可用?
  • 在 groovy @MartinHonnen 中更容易。 Tpi,你能想出一个更容易理解的例子吗?也许在 XML 中有根节点?
  • Tim,我有一个名为 ID_Number 的字段。我需要创建具有共同 ID_Numbers 的段组,并且需要添加额外的标签来识别具有不同 ID 的元素

标签: xml groovy


【解决方案1】:

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

如果您的 mySegment 元素不是根的子元素,您可以使用 root.'**'.findAll{el -&gt; 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)}

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多