2015-11-30 5 views
1

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

Для записи изменений в файл, я использую метод

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

Я сомневаюсь, что есть простой способ отформатировать XML-файл groovy на этом уровне. Поскольку выход является допустимым XML, вы не можете использовать somekind 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> 
+0

благодаря Will P для вашего предложения. это хорошая идея добавить CR/LF (newline) к каждому атрибуту, который можно найти с помощью reg exp. Я проверю, хорошо ли это для моей цели. –

+0

В настоящее время этот пример отлично работает, я ввел две модификации: 1) it + "\ n \ t" // изменил порядок 2) replaceAll (/ [0-9a-zA-Z] * = "[^ \ "] *" /) // добавленные номера –