0

私は次のxmlスキーマを持っています:

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name="DataPackage">
    <xsd:sequence>
        <xsd:element name="timestamp" type="xsd:float" default="0.0"/>
        <xsd:element name="type" type="xsd:string" default="None"/>
        <xsd:element name="host" type="xsd:string" default="None"/>
        <xsd:element name="data" type="Data" />
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Data">
    <xsd:sequence>
        <xsd:element name="item" type="Item" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Item">
    <xsd:sequence>
        <xsd:element name="key" type="xsd:string"/>
        <xsd:element name="val" type="xsd:string"/>
    </xsd:sequence>
 </xsd:complexType>

</xsd:schema>

以前pyxbgen -u DataPackage.xsd -m DataPackageは対応する python クラスを生成し、これらを使用して次の xml コードを生成しました。

<?xml version="1.0" encoding="utf-8"?>
<DataPackage>
<timestamp>1378970933.29</timestamp>
<type>None</type>
<host>Client 1</host>
<data>
    <item>
        <key>KEY1</key>
        <val>value1</val>
    </item>
</data>
</DataPackage>

Pythonインタープリターで次を使用してこれを読み取ろうとすると:

import DataPackage
xml = file("dataPackage-Test.xml").read()
data = DataPackage.CreateFromDocument(xml)

私は例外を受け取ります:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "DataPackage.py", line 54, in CreateFromDocument
    instance = handler.rootObject()
  File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/saxer.py", line 274, in   rootObject
    raise pyxb.UnrecognizedDOMRootNodeError(self.__rootObject)
pyxb.exceptions_.UnrecognizedDOMRootNodeError: <pyxb.utils.saxdom.Element object at  0x9c7c76c>

誰が何が悪いのか考えていますか?

4

1 に答える 1

1

スキーマでは、DataPackage という名前の最上位の複合型が定義されていますが、最上位の要素は定義されていません。したがって、DOM 要素 DataPackage には、PyXB がそれを処理するために使用できる対応する要素がありません。

次のようなものを追加する必要があります。

<element name="DataPackage" type="DataPackage"/>

XML スキーマでは、要素と型の名前空間は別個のものですが、Python ではそうではないことに注意してください。そのため、競合を避けるために、PyXB はそのうちの 1 つ (この場合は複合型) の名前を変更します。http://pyxb.sourceforge.net/arch_binding.html?highlight=conflict#deconflicting-namesを参照してください。

于 2013-09-25T19:26:56.933 に答える