Изменить XML при сохранении макета
-
06-07-2019 - |
Вопрос
Что бы вы использовали для изменения XML-файла при сохранении максимально возможного размера макета, включая отступы и комментарии?
Моя проблема в том, что у меня есть несколько огромных отредактированных вручную XML-файлов, описывающих пользовательский интерфейс, и теперь мне нужно перевести несколько атрибутов на другой язык.
Я пытался сделать это, используя Python + ElementTree, но он не сохранил ни пробелов, ни комментариев.
Я видел XSLT, предложенный для подобных вопросов, но я не думаю, что это альтернатива в этом случае, так как мне нужно сделать некоторую логику и поиск для каждого атрибута.
Было бы предпочтительно, если бы порядок атрибутов в каждом элементе также сохранялся, но я могу допустить изменение порядка.
Решение
Любой модуль манипулирования DOM должен соответствовать вашим потребностям. Макет - это просто текстовые данные, поэтому в DOM он представлен как текстовые узлы:
>>> from xml.dom.minidom import parseString
>>> dom = parseString('''\
... <message>
... <text>
... Hello!
... </text>
... </message>''')
>>> dom.childNodes[0].childNodes
[<DOM Text node "u'\n '">, <DOM Element: text at 0xb765782c>, <DOM Text node "u'\n'">]
>>> text = dom.getElementsByTagName('text')[0].childNodes[0]
>>> text.data = text.data.replace(u'Hello', u'Hello world')
>>> print dom.toxml()
<?xml version="1.0" ?><message>
<text>
Hello world!
</text>
</message>
Другие советы
Если вы используете процессор XSLT, например xt , вы можете написать расширение методы в Java, которые могут выполнить любое произвольное преобразование, которое вам нужно.
Сказав это, я использовал Python xml.dom.minidom модуль успешно для такого рода преобразований. Это сохраняет пробелы и расположение.