1

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

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

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 保持在每个属性之间?

4

1 回答 1

0

我怀疑是否有任何简单的方法可以将 groovy 的 xml 输出格式化为该级别。由于输出是一个有效的 XML,你不能使用某种perl 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 
}

将打印:

<?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>
于 2015-11-30T14:27:57.177 回答