在groovy中将csv转换为xml

时间:2014-12-18 19:29:22

标签: xml csv groovy

我需要使用以下格式将csv文件转换为xml:

输入csv是

scott,male,26,doctor
ryan,male,20,student
laura,female,30,lawyer

生成的xml应为

<root>
<criteria name="scott" sex = "male" age = "26" profession = "doctor"/>
<criteria name="ryan" sex = "male" age = "20" profession = "student"/>
<criteria name="laura" sex = "female" age = "30" profession = "lawyer"/>
<root/>

并且在csv中如果缺少像职业那样的任何字段,

laura,female,30

生成的xml应为

<criteria name="laura" sex = "female" age = "30"/>

如果csv是:

 laura,female,,lawyer

它产生

<criteria name="laura" sex = "female" age = "" profession = "lawyer"/>

我希望xml在哪里

 <criteria name="laura" sex = "female" profession = "lawyer"/>

有人可以帮我解决在groovy中执行此操作的代码吗?

我正在使用的代码是

CommonsMultipartFile multiPartFile=fileList.first()
                params.type = 'text/csv'
                if(CSV_MIME_TYPE.contains(params.type)){
                    InputStream  inputStream= multiPartFile.getInputStream()
                    def writer=new StringWriter()
                    def xmlBuilder= new MarkupBuilder(writer)
                    xmlBuilder.setDoubleQuotes(true)
                    xmlBuilder.root(){  
                        inputStream.eachLine{ line->
                            def a,b,c,d,e,f,g
                            (a,b,c,d) = line.split(',',-1)
                                      criteria(name:a,sex:b,age:c,profession:d)
                        }

2 个答案:

答案 0 :(得分:2)

摆脱空字段的最简单方法是使用另一种映射方法。如果空值不在criteria()调用的映射中,则不会生成任何内容。所以你可以像这样映射和过滤它们:

def line = 'laura,female,,lawyer'
def mapping = ['name', 'sex', 'age', 'profession']
// use criteria instead of println there
println([mapping,line.split(',',-1)*.trim()].transpose().findAll{it[1]}.collectEntries())
//=> [name:laura, sex:female, profession:lawyer]

transpose将映射中的键与行中的值组合在一起(每个列表只需要相同的数量,因此行末的丢失数据没有问题);下一步过滤所有emtpy值,最后collectEntries将这些值转换为地图

答案 1 :(得分:0)

您的代码按预期工作,但CSV代码段laura,female,,lawyer中有一个额外的逗号,它会丢弃您的CSV'解析器'。

您的代码的缩写按预期工作,此处位于Groovy web console(单击“执行脚本”,然后打开“输出”选项卡 - 如果控制台加载为空,请尝试重新加载)。