Как создать XML-файл через ElementTree в Python с зарегистрированными пространствами имен, записанными в выводе - PullRequest
1 голос
/ 12 июня 2019

Мне нужно создать файл XML на основе заданной схемы.Эта схема требует от меня использования префикса пространства имен для элементов в сгенерированном XML-файле.

Мне нужно использовать cElementTree в целях обратной совместимости.В то же время я хочу печатать вывод XML, то есть с отступами.Я знаю, что это можно сделать через xml.dom.

Вот что я попробовал:

import sys
import cElementTree as ET
from xml.dom import minidom
ET.register_namespace('xs', 'http://www.w3.org/2001/XMLSchema')
root = ET.Element('House')
ET.SubElement(root, 'Room')
etreeString = ET.tostring(root, 'utf-8')

Вывод для приведенного выше кода:

<House><Room /></House>

Как можноЯ правильно получаю элементы с префиксом стандартного пространства имен?Кроме того, как я могу получить файл XML, который содержит объявление XML вверху?

Я попытался создать экземпляр класса xml.etree.ElementTree.ElementTree, чтобы использовать метод write, как здесь:

tree = ET.ElementTree(root)
tree.write(sys.stdout)

но, опять же, я не получаю пространства имен:

<House><Room /></House>

Наконец, если я попытаюсь добавить префиксы при создании каждого элемента (что выглядит странно), xml.dom будетНе разбирайте его, потому что я не знаю, как настроить синтаксический анализ с префиксами пространства имен:

>>> kitchenElem = ET.SubElement(root, 'xs:Kitchen')
>>> tree = ET.ElementTree(root)
>>> tree.write(sys.stdout)
<House><Room /><xs:Kitchen /><xs:Kitchen /></House>
>>> etreeString = ET.tostring(root, 'utf-8')
>>> etreeString
'<House><Room /><xs:Kitchen /><xs:Kitchen /></House>'
>>> minidomParsed = minidom.parseString(etreeString)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ext\vc12_win32\lib\python2.7\site-packages\_xmlplus\dom\minidom.py", line 1925, in parseString
  File "ext\vc12_win32\lib\python2.7\site-packages\_xmlplus\dom\expatbuilder.py", line 942, in parseString
  File "ext\vc12_win32\lib\python2.7\site-packages\_xmlplus\dom\expatbuilder.py", line 223, in parseString
ExpatError: unbound prefix: line 1, column 15

1 Ответ

1 голос
/ 12 июня 2019

Чтобы получить правильно префиксное имя, попробуйте использовать QName().

Чтобы написать XML с объявлением XML, попробуйте использовать xml_declaration=True в ElementTree.write().

Пример ...

Python

import xml.etree.cElementTree as ET

ns = {"xs": "http://www.w3.org/2001/XMLSchema"}

ET.register_namespace('xs', ns["xs"])
root = ET.Element(ET.QName(ns["xs"], "House"))
ET.SubElement(root, ET.QName(ns["xs"], "Room"))

ET.ElementTree(root).write("output.xml", xml_declaration=True, encoding="utf-8")

Вывод XML

<?xml version='1.0' encoding='utf-8'?>
<xs:House xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:Room /></xs:House>

Примечание: Вам не нужно использовать словарь ns. Я просто использовал его, чтобы у меня не было полного пространства имен uri.

...