python pyxb UnrecognizedDOMRootNodeError(узел)
Я пытаюсь создать модуль pyxb из схемы LabVIEW. Используя модуль, я получаю UnrecognizedDOMRootNodeError:
Traceback (most recent call last): File "X:\Projects\LV-PY\Python\LV-PY\pyXB\testXML.py", line 14, in <module> fc_return = cluster.CreateFromDOM(doc.documentElement) File "X:\Projects\LV-PY\Python\LV-PY\pyXB\cluster.py", line 76, in CreateFromDOM return pyxb.binding.basis.element.AnyCreateFromDOM(node, default_namespace) File "C:\Python27\lib\site-packages\pyxb\binding\basis.py", line 1743, in AnyCreateFromDOM return cls.CreateDOMBinding(node, expanded_name.elementBinding(), _fallback_namespace=fallback_namespace) File "C:\Python27\lib\site-packages\pyxb\binding\basis.py", line 1705, in CreateDOMBinding raise pyxb.UnrecognizedDOMRootNodeError(node) pyxb.exceptions_.UnrecognizedDOMRootNodeError: <pyxb.utils.saxdom.Element object at 0x0625F9D0>
Поскольку схема LabVIEW огромна, я сделал ее небольшой пример с использованием только кластера, содержащего строку:
<xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:lv="http://www.ni.com/labview" elementFormDefault="qualified"
targetNamespace="http://www.ni.com/labview"
xmlns="http://www.ni.com/labview">
<!--Root element that contains all other data-->
<!--will NOT be produced by primitive-->
<xsd:element name="LVData" type="lv:LVDataRootType"/>
<xsd:complexType name="LVDataRootType">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="Cluster" type="lv:ClusterType"/>
<xsd:element name="String" type="lv:StringType"/>
</xsd:choice>
</xsd:complexType>
<!--Basic elements-->
<xsd:complexType name="StringType">
<xsd:complexContent>
<xsd:extension base="lv:LVDataType"/>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="LVDataType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string" minOccurs="1"/>
<xsd:element name="Val" type="xsd:string" minOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<!--Cluster element-->
<xsd:complexType name="ClusterType">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="NumElts" type="xsd:unsignedByte"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="String" type="lv:StringType"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Затем я отправил вывод XML из простого кластера LabVIEW:
<Cluster>
<Name>clTest</Name>
<NumElts>1</NumElts>
<String>
<Name>sTest</Name>
<Val>foo</Val>
</String>
</Cluster>
Я предполагаю, что проблема связана с ответом pabigot от: подобный вопрос
в XML-схеме пространства имен для элементов и типов различны, но в Python их нет,
Но я не так уверен. Нужно ли менять тип lv:... во всей схеме LabView, чтобы иметь одинаковые имя и тип?
Другими словами, а не:
<xsd:element name="Cluster" type="lv:ClusterType"/>
должен ли я иметь:
<xsd:element name="Cluster" type="Cluster"/>
Это было бы серьезным изменением в схеме LabVIEW, которая делает подобные вещи повсюду.
1 ответ
Есть две проблемы с вашим документом. Схема ожидает элемент верхнего уровня {http://www.ni.com/labview}LVData
в то время как ваш документ имеет элемент верхнего уровня Cluster
, Вам нужно обернуть свой документ и добавить объявление пространства имен. Документ ниже не выдает ошибку.
<LVData xmlns="http://www.ni.com/labview">
<Cluster>
<Name>clTest</Name>
<NumElts>1</NumElts>
<String>
<Name>sTest</Name>
<Val>foo</Val>
</String>
</Cluster>
</LVData>