Библиотека Ruby для манипулирования XML с минимальными различиями? - PullRequest
2 голосов
/ 22 августа 2010

У меня есть файл XML (фактически файл проекта Visual C #), которым я хочу манипулировать с помощью сценария Ruby. Я хочу прочитать XML в память, поработать с ними, включая изменение некоторых атрибутов и текста (исправление некоторых ссылок на пути), а затем записать файл XML обратно. Это не так сложно.

Сложность в том, что я хочу, чтобы файл, который я пишу, выглядел так же, как файл, в котором я читал, за исключением того, где я внес изменения. Если во входном файле используются двойные кавычки, я хочу, чтобы на выходе использовались двойные кавычки. Если перед входом был пробел до />, я хочу, чтобы вывод делал то же самое. По сути, я хочу, чтобы выходные данные были такими же, как и входные, за исключением тех случаев, когда я вносил изменения явно (в моем случае это будут только значения атрибутов или текстовое содержимое элемента).

Мне нужны минимальные различия, потому что этот файл проекта проверен на контроль версий - и потому что в следующий раз, когда я внесу изменение в Visual Studio, он все равно переписает его в предпочитаемом формате. Я хочу избежать проверки множества бессмысленных различий, которые затем будут изменены снова в ближайшем будущем. Я также хочу избежать необходимости открывать проект в Visual Studio, вносить изменения и сохранять до того, как я смогу зафиксировать изменения в своем скрипте Ruby. Я хочу, чтобы мой скрипт на Ruby просто вносил свои изменения, ничего более.

Изначально я только что проанализировал файл с помощью регулярных выражений, но столкнулся со случаями, когда мне действительно понадобилась библиотека XML, потому что мне нужно было больше узнать о дочерних элементах. Поэтому я перешел на REXML. Но это вносит следующие нежелательные изменения в мое форматирование:

  • Изменяет все атрибуты с двойных кавычек на одинарные.
  • Он экранирует все апострофы внутри значений атрибутов (изменяя их на ').
  • Удаляет пробел до />.
  • Сортирует атрибуты каждого элемента в алфавитном порядке, а не сохраняет первоначальный порядок.

Я работаю над этим, выполняя кучу gsub вызовов для вывода REXML, но есть ли библиотека Ruby XML-манипуляций, которая лучше подходит для сценариев "минимального различия"?

1 Ответ

1 голос
/ 22 августа 2010

Вы можете создать свой собственный анализатор SAX (например, используя Nokogiri , это очень просто, и я рекомендую его использовать), чтобы проанализировать ваш XML-файл, изменить некоторые данные в нем и очистить обработанный XMLфайл с вашими собственными настройками, созданный с нуля, генератор XML.Плохая новость заключается в том, что в этом случае вам нужно создать крошечную библиотеку XML и подпрограмму генератора, так что это не обычная задача.

Другой способ: не создавать синтаксический анализатор SAX, а писать генератор XML,Изучите XML с вашей любимой библиотекой, измените то, что вам нужно, и сгенерируйте все, что вы хотите.Вам просто нужно рекурсивно пройтись по всем узлам в вашем документе и вывести их в соответствии с вашими соглашениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...