Groovy: сохранение CR/LF атрибутов при сериализации XMLSlurper

Я новичок с отличным (несколько недель опыта). В настоящее время я пытаюсь обработать визуальную студию .vcproj файлы, использующие groovy: замена некоторых путей, которые будут найдены шаблонами регулярных выражений. Это прекрасно работает для меня.

Чтобы записать изменения в файл, я использую

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 или serialize-класс, чтобы держать CR/LF между каждым атрибутом?

1 ответ

Я сомневаюсь, что есть какой-либо простой способ отформатировать вывод XML Groovy до этого уровня. Поскольку вывод является действительным 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>
Другие вопросы по тегам