繁体   English   中英

Groovy脚本以读取和转换xml

[英]Groovy Script to read and transform xml

需要有关Groovy脚本的帮助。 我有以下输入xml,其中将动态填充该xml,但对于在RecordDetails节点下将填充多少个节点,我们没有任何线索。

输入:

<?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并使用运行器执行
  • 改变常规。

看起来您正在寻找下一个。

这是常规脚本:

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)

可以在线快速尝试演示

输出:

在此处输入图片说明

编辑:基于OP的问题。

mkp.xmlDeclaration() -添加<?xml version="1.0"?>

details.each { detail -> -details是列表。 我们想遍历每个细节。 每个值都会detail

for(detail : details)类似。

fld也与上述相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM