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>