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

Serialization Groovy:序列化XMLSlurper时保留属性的CR/LF,serialization,groovy,xmlslurper,html-xml-utils,Serialization,Groovy,Xmlslurper,Html Xml Utils,我刚接触groovy(几周的经验)。目前,我正在尝试使用groovy处理一些visual studio.vcproj文件:替换一些路径,这些路径将由regexp模式找到。这对我来说很好 要将更改写入文件,我使用 XmlUtil.serialize(slurper, writer) 方法,在哪里 def writer = new FileWriter(outputFile) 及 这也很好,除了一件事。 在原始的vcproj文件中,每个属性位于单独的一行中,如: <Configuratio

我刚接触groovy(几周的经验)。目前,我正在尝试使用groovy处理一些visual studio
.vcproj
文件:替换一些路径,这些路径将由regexp模式找到。这对我来说很好

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

XmlUtil.serialize(slurper, writer)
方法,在哪里

def writer = new FileWriter(outputFile)

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

<Configurations>
        <Configuration
            Name="Debug|Win32"
            OutputDirectory="$(ConfigurationName)"
            IntermediateDirectory="$(ConfigurationName)"
            ConfigurationType="1"
            InheritedPropertySheets="..\..\..\..\Test_Debug.vsprops"
            CharacterSet="2"
            >
对于XMS解析器来说,这应该不是问题,但是在后处理过程中,一些perl脚本使用这个
vcproj
文件,它们抱怨属性行中缺少CR/LF


那么,是否有任何简单的方法可以配置
XMLslurper
或serialize类,使CR/LF保持在每个属性之间?

我怀疑是否有任何简单的方法可以将groovy的xml输出格式化到该级别。由于输出是有效的XML,您不能使用某种类型的XML吗

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

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 
}
import groovy.xml.XmlUtil
def original=''
'''
parsed=新的XmlParser()。原始解析文本
println XmlUtil.serialize(已解析).replaceAll(/[a-zA-Z]*=“[^\”]*”/){
“\n”+它
}
将打印:

<?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>

我怀疑是否有任何简单的方法可以将groovy的xml输出格式化到该级别。既然输出是有效的xml,您就不能使用某种类型的xml吗

除此之外,您还可以尝试将属性与正则表达式匹配,并在其中添加换行符。这是一个非常难看的攻击:

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 
}
import groovy.xml.XmlUtil
def original=''
'''
parsed=新的XmlParser()。原始解析文本
println XmlUtil.serialize(已解析).replaceAll(/[a-zA-Z]*=“[^\”]*”/){
“\n”+它
}
将打印:

<?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>


谢谢您的建议。将CR/LF(换行符)添加到使用reg exp可以找到的每个属性中是一个好主意。我将检查这是否适合我的目的。目前该示例工作正常,我插入了两个修改:1)它+“\n\t”//更改了顺序2)replaceAll(/[0-9a-zA-Z]*=”[^\“]*/)//添加的数字感谢您的建议。将CR/LF(换行符)添加到使用reg exp可以找到的每个属性中是一个好主意。我将检查这是否适合我的目的。目前该示例工作正常,我插入了两个修改:1)它+“\n\t”//更改了顺序2)replaceAll(/[0-9a-zA-Z]*=”[^\]*”/)添加的数字