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也同上