Я знаю, что это не python, но для меня это pythonic: C # с интерпретатором csharp из mono :
using System.Xml.Linq;
var doc = XDocument.Load(Console.In);
foreach(var node in doc.Descendants().Reverse())
node.ReplaceWith(new XElement(
node.Name.Namespace + node.Name.LocalName.Replace("-","_"),
node.Attributes(),
node.Nodes()));
doc.Save(Console.Out);
Это имеет следующие важные свойства, которые могут бытьтрудно сделать, не полагаясь на существующую библиотеку XML:
- поддерживает смешанные элементы (содержащие текст и дочерние элементы)
- сохраняет пространства имен
- сохраняет атрибуты
- поддерживает все функции XML 2.0 (CDATA, неразобранные, ссылки на сущности и т. д.)
- и т. д.
Демонстрация:
input.xml:
<?xml version="1.0"?>
<job xmlns:ex="test">
<server attr1="first" attr2="second">
<ex:cpu-set>
</ex:cpu-set>
</server>
<ip-routings>
contained <mixed/>text
</ip-routings>
</job>
Вывод csharp -r:System.Xml.Linq test < input.xml
:
<?xml version="1.0" encoding="utf-8"?>
<job xmlns:ex="test">
<server attr1="first" attr2="second">
<ex:cpu_set />
</server>
<ip_routings>
contained <mixed />text
</ip_routings>
</job>