【问题标题】:Groovy: keeping of CR/LF of attributes while serializing XMLSlurperGroovy:在序列化 XMLSlurper 时保留属性的 CR/LF
【发布时间】:2015-11-30 13:06:02
【问题描述】:

我是 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"
            >

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

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

【问题讨论】:

    标签: serialization groovy xmlslurper html-xml-utils


    【解决方案1】:

    我怀疑是否有任何简单的方法可以将 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>
    

    【讨论】:

    • 感谢 Will P 的提议。将 CR/LF(换行符)添加到可以使用 reg exp 找到的每个属性是一个好主意。我会检查这是否适合我的目的。
    • 当前示例运行良好,我已插入两个修改:1) it + "\n\t" // 更改了顺序 2) replaceAll(/[0-9a-zA-Z] *="[^\"]*"/) // 相加数字
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2011-08-28
    • 2016-12-28
    • 2012-11-11
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多