В эти дни, наиболее популярны (и очень простой) вариант является ElementTree API, , который был включен в стандартную библиотеку с Python 2.5.
Доступные варианты для этого являются:
- ElementTree (Basic, реализация чистого питон ElementTree части стандартной библиотеки, так как 2.5.)
- cElementTree (оптимизированная реализация C из ElementTree Также предлагаются. стандартная библиотека начиная с 2.5)
- LXML (на основе libxml2. Он предлагает богатый надмножество API ElementTree, а также в XPath, CSS селекторы, и больше)
Вот пример того, как сгенерировать пример документа с помощью cElementTree в-STDLIB:
import xml.etree.cElementTree as ET
root = ET.Element("root")
doc = ET.SubElement(root, "doc")
ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"
tree = ET.ElementTree(root)
tree.write("filename.xml")
Я проверил его и он работает, но я предполагаю, что пустое пространство не имеет существенного значения. Если вам нужен отпечаток «prettyprint», дайте мне знать, и я посмотрю, как это сделать. (. Это может быть вариант LXML конкретного я не использую реализации STDLIB много)
Для дальнейшего чтения, вот некоторые полезные ссылки:
В качестве последнего замечания, либо cElementTree или LXML должно быть достаточно быстро для всех ваших потребностей (оба оптимизированный код C), но в событие вы находитесь в ситуации, когда вам нужно выжать каждый последний бит производительности, тесты на сайте LXML показывают, что:
- LXML явно выигрывает для сериализации (генераторный) XML
- Как побочного эффект реализации правильного обхода родителя, LXML немного медленнее, чем cElementTree для синтаксического анализа.
Я получаю 'import xml.etree.cElementTree как ET',' ImportError: Нет модуля с именем etree.cElementTree' - стандартный OSX 10.8 python, но как-то он работает, когда я запускаю его изнутри ipython. – guaka
@ Kasper: У меня нет Mac, поэтому я не могу попытаться дублировать проблему. Скажите мне версию Python, и я посмотрю, смогу ли я ее воспроизвести в Linux. – ssokolow
@ssokolow, я сейчас на OSX 10.9, и это как-то было разрешено, я не помню, было ли это мое собственное действие или я сделал что-то, чтобы его разрешить. – guaka