我是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?
答案 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>