Groovy:在序列化XMLSlurper时保留属性的CR / LF

时间:2015-11-30 13:06:02

标签: serialization groovy xmlslurper html-xml-utils

我是groovy的新人(几周的经验)。目前我正在尝试使用groovy处理一些visual studio .vcproj文件:替换一些路径,这些路径将通过正则表达式模式找到。这对我来说很好。

要将更改写入文件,请使用

XmlUtil.serialize(slurper, writer)

方法,其中

def writer = new FileWriter(outputFile)

def slurper = new XmlSlurper(keepIgnorableWhitespace:true).parse(it)

这也很好,除了一件事。 在原始vcproj文件中,每个属性都在一个单独的行中,如:

<Configurations>
        <Configuration
            Name="Debug|Win32"
            OutputDirectory="$(ConfigurationName)"
            IntermediateDirectory="$(ConfigurationName)"
            ConfigurationType="1"
            InheritedPropertySheets="..\..\..\..\Test_Debug.vsprops"
            CharacterSet="2"
            >

但在调用serialize()类的XMLUtil方法后,整个输出存储在一行中:

<Configurations>
        <Configuration Name="Debug|Win32" InheritedPropertySheets="..\..\..\..\Test_Debug.vsprops" OutputDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" ConfigurationType="1" CharacterSet="2">

对于XMS解析器这应该不是问题,但在后处理中,一些perl脚本使用此vcproj文件,并且他们抱怨在属性行中缺少CR / LF。

那么是否有可能配置XMLslurper或序列化类以保持每个属性之间的CR / LF?

1 个答案:

答案 0 :(得分:0)

我怀疑有什么简单的方法可以将groovy的xml输出格式化到该级别。由于输出是有效的XML,您是否不能使用某些perl XML parser

除此之外,您可以尝试将属性与正则表达式匹配,并为它们添加换行符。一个非常丑陋的黑客:

import groovy.xml.XmlUtil

def original = '''<Configurations>
        <Configuration
            Name="Debug|Win32"
            OutputDirectory="$(ConfigurationName)"
            IntermediateDirectory="$(ConfigurationName)"
            ConfigurationType="1"
            InheritedPropertySheets="..\\..\\..\\..\\Test_Debug.vsprops"
            CharacterSet="2"
            >
        </Configuration>
    </Configurations>
            '''

parsed = new XmlParser().parseText original

println XmlUtil.serialize(parsed).replaceAll(/[a-zA-Z]*="[^\"]*"/) {
    "\n" + it 
}

将打印:

<?xml 
version="1.0" 
encoding="UTF-8"?><Configurations>
  <Configuration 
Name="Debug|Win32" 
OutputDirectory="$(ConfigurationName)" 
IntermediateDirectory="$(ConfigurationName)" 
ConfigurationType="1" 
InheritedPropertySheets="..\..\..\..\Test_Debug.vsprops" 
CharacterSet="2"/>
</Configurations>