У меня есть файл XML (фактически файл проекта Visual C #), которым я хочу манипулировать с помощью сценария Ruby. Я хочу прочитать XML в память, поработать с ними, включая изменение некоторых атрибутов и текста (исправление некоторых ссылок на пути), а затем записать файл XML обратно. Это не так сложно.
Сложность в том, что я хочу, чтобы файл, который я пишу, выглядел так же, как файл, в котором я читал, за исключением того, где я внес изменения. Если во входном файле используются двойные кавычки, я хочу, чтобы на выходе использовались двойные кавычки. Если перед входом был пробел до />
, я хочу, чтобы вывод делал то же самое. По сути, я хочу, чтобы выходные данные были такими же, как и входные, за исключением тех случаев, когда я вносил изменения явно (в моем случае это будут только значения атрибутов или текстовое содержимое элемента).
Мне нужны минимальные различия, потому что этот файл проекта проверен на контроль версий - и потому что в следующий раз, когда я внесу изменение в Visual Studio, он все равно переписает его в предпочитаемом формате. Я хочу избежать проверки множества бессмысленных различий, которые затем будут изменены снова в ближайшем будущем. Я также хочу избежать необходимости открывать проект в Visual Studio, вносить изменения и сохранять до того, как я смогу зафиксировать изменения в своем скрипте Ruby. Я хочу, чтобы мой скрипт на Ruby просто вносил свои изменения, ничего более.
Изначально я только что проанализировал файл с помощью регулярных выражений, но столкнулся со случаями, когда мне действительно понадобилась библиотека XML, потому что мне нужно было больше узнать о дочерних элементах. Поэтому я перешел на REXML. Но это вносит следующие нежелательные изменения в мое форматирование:
- Изменяет все атрибуты с двойных кавычек на одинарные.
- Он экранирует все апострофы внутри значений атрибутов (изменяя их на
'
).
- Удаляет пробел до
/>
.
- Сортирует атрибуты каждого элемента в алфавитном порядке, а не сохраняет первоначальный порядок.
Я работаю над этим, выполняя кучу gsub
вызовов для вывода REXML, но есть ли библиотека Ruby XML-манипуляций, которая лучше подходит для сценариев "минимального различия"?