Groovy 要读取和转换的脚本 xml
Groovy Script to read and transform xml
需要有关 Groovy 脚本的帮助。我有以下输入 xml,其中此 xml 将被动态填充,我们没有任何关于 RecordDetails
Node.
下将填充多少节点的线索
输入:
<?xml version="1.0" encoding="UTF-8"?>
<Record>
<XYZ>
<Header>
<Code>12345</Code>
</Header>
<Details>
<RecID>1</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
<Address>123,acdf</Address>
</RecordDetail>
</Details>
<Details>
<RecID>2</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
</RecordDetail>
</Details>
</XYZ>
</Record>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<Record>
<Header>
<Code>12345</Code>
</Header>
<Details>
<RecID>1</RecID>
<RecordDetail>
<FieldName>NAME</FieldName>
<FieldValue>ABC</FieldValue>
</RecordDetail>
<RecordDetail>
<FieldName>Email</FieldName>
<FieldValue>ABC@a.com</FieldValue>
</RecordDetail>
</Details>
</Record>
您只需要转换输入 xml。
这可以通过以下方式实现:
- 写一个xslt,用runner执行
- 在 groovy 本身进行转换。
看来你要找的是后一个。
这是 groovy 脚本:
def xml = '''<?xml version="1.0" encoding="UTF-8"?>
<Record>
<XYZ>
<Header>
<Code>12345</Code>
</Header>
<Details>
<RecID>1</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
<Address>123,acdf</Address>
</RecordDetail>
</Details>
<Details>
<RecID>2</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
</RecordDetail>
</Details>
</XYZ>
</Record>'''
def parsedXml = new XmlSlurper().parseText(xml)
def builder = new groovy.xml.StreamingMarkupBuilder()
builder.encoding = 'UTF-8'
def transformedXml = builder.bind {
mkp.xmlDeclaration()
Record {
Header {
Code (parsedXml.'**'.find{ it.name() == 'Code'})
}
def details = parsedXml.'**'.findAll{ it.name() == 'Details'}
details.each { detail ->
Details {
RecID (detail.RecID)
detail.RecordDetail.children().each { fld ->
RecordDetail {
FieldName (fld.name())
FieldValue (fld.text())
}
}
}
}
}
}
println groovy.xml.XmlUtil.serialize(transformedXml)
这个可以在线快速试用Demo
输出:
编辑: 根据 OP 的问题。
mkp.xmlDeclaration()
- 添加 <?xml version="1.0"?>
details.each { detail ->
- 详细信息列表。我们想遍历每个细节。每个值都进入 detail
.
类似于for(detail : details)
。
fld
也同上
需要有关 Groovy 脚本的帮助。我有以下输入 xml,其中此 xml 将被动态填充,我们没有任何关于 RecordDetails
Node.
输入:
<?xml version="1.0" encoding="UTF-8"?>
<Record>
<XYZ>
<Header>
<Code>12345</Code>
</Header>
<Details>
<RecID>1</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
<Address>123,acdf</Address>
</RecordDetail>
</Details>
<Details>
<RecID>2</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
</RecordDetail>
</Details>
</XYZ>
</Record>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<Record>
<Header>
<Code>12345</Code>
</Header>
<Details>
<RecID>1</RecID>
<RecordDetail>
<FieldName>NAME</FieldName>
<FieldValue>ABC</FieldValue>
</RecordDetail>
<RecordDetail>
<FieldName>Email</FieldName>
<FieldValue>ABC@a.com</FieldValue>
</RecordDetail>
</Details>
</Record>
您只需要转换输入 xml。
这可以通过以下方式实现:
- 写一个xslt,用runner执行
- 在 groovy 本身进行转换。
看来你要找的是后一个。
这是 groovy 脚本:
def xml = '''<?xml version="1.0" encoding="UTF-8"?>
<Record>
<XYZ>
<Header>
<Code>12345</Code>
</Header>
<Details>
<RecID>1</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
<Address>123,acdf</Address>
</RecordDetail>
</Details>
<Details>
<RecID>2</RecID>
<RecordDetail>
<Name>ABC</Name>
<Email>abc@in.com</Email>
</RecordDetail>
</Details>
</XYZ>
</Record>'''
def parsedXml = new XmlSlurper().parseText(xml)
def builder = new groovy.xml.StreamingMarkupBuilder()
builder.encoding = 'UTF-8'
def transformedXml = builder.bind {
mkp.xmlDeclaration()
Record {
Header {
Code (parsedXml.'**'.find{ it.name() == 'Code'})
}
def details = parsedXml.'**'.findAll{ it.name() == 'Details'}
details.each { detail ->
Details {
RecID (detail.RecID)
detail.RecordDetail.children().each { fld ->
RecordDetail {
FieldName (fld.name())
FieldValue (fld.text())
}
}
}
}
}
}
println groovy.xml.XmlUtil.serialize(transformedXml)
这个可以在线快速试用Demo
输出:
编辑: 根据 OP 的问题。
mkp.xmlDeclaration()
- 添加 <?xml version="1.0"?>
details.each { detail ->
- 详细信息列表。我们想遍历每个细节。每个值都进入 detail
.
类似于for(detail : details)
。
fld
也同上