Экземпляр Pyxb <element> не имеет связанного элемента для начального тега
Я использовал файл схемы (.xsd) для генерации классов Python для генерации xml-кода. Я могу использовать все сгенерированные calsses, но получаю ошибку, если пытаюсь
print d.toxml("utf-8")
File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/basis.py", line 541, in toxml
dom = self.toDOM(bds)
File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/basis.py", line 513, in toDOM
raise pyxb.UnboundElementError(self)
pyxb.exceptions_.UnboundElementError: Instance of type visionDataPackage has no bound element for start tag
Оказывается, атрибут element_name элемента отсутствует. Поэтому, если я установлю в /usr/local/lib/python2.7/dist-packages/pyxb/binding/basis.py имя_элемента:
element_name="visionDataPackage"
if (element_name is None) and (self._element() is not None):
element_binding = self._element()
element_name = element_binding.name()
need_xsi_type = need_xsi_type or element_binding.typeDefinition()._RequireXSIType(type(self))
if element_name is None:
raise pyxb.UnboundElementError(self)
Все работает. Так что я делаю не так?
1 ответ
Вероятно, то, что вы делаете, создает d
используя его тип, а не элемент. Например, если ваша схема имеет:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="atype">
<xs:sequence>
<xs:element name="entry" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="anelt" type="atype"/>
</xs:schema>
и ты должен был сделать d = atype()
затем d
не будет привязан ни к какому элементу. Если вы вместо этого использовали d = anelt()
, затем d
все равно будет примером atype
, но это будет связано с anelt
, Именно эта привязка сообщает PyXB, какой тег элемента использовать при создании DOM или текстового XML-представления из объекта.
То, что PyXB ранее назначал тег элемента по умолчанию, выведенный из базового типа, когда объект не был связан с элементом, было давней ошибкой, обнаруженной и исправленной в PyXB 1.2.3.
Смотрите дополнительную дискуссию на дискуссионном форуме PyXB SF.