2016-04-25 11 views
0

Ich habe eine Xsd-Datei und muss entsprechend ein XML erstellen.Python pyxb: Erstellen von XML mit komplexen eingebetteten Typ

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1" elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:simpleType name="edateTimeType"> 
    <xs:restriction base="xs:dateTime"> 

    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="eEurocents"> 
    <xs:restriction base="xs:int"> 
     <xs:maxExclusive value="1000000"/> 
     <xs:minExclusive value="-1000000"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="unixTimestampType"> 
    <xs:restriction base="xs:nonNegativeInteger"> 
     <xs:minInclusive value="1262304000"/> 
     <!-- after 1.1.2010--> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="timeRangeType"> 
    <xs:sequence> 
     <xs:element name="start" type="edateTimeType" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="stop" type="edateTimeType" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:element name="apiobject"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="header" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="A" type="eEurocents" minOccurs="1" maxOccurs="1"/> 
       <xs:element name="B" type="eEurocents" minOccurs="0" maxOccurs="1"/> 
       <xs:element name="unixTimestamp" type="unixTimestampType" minOccurs="1" maxOccurs="1"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:choice maxOccurs="1"> 
      <xs:element name="response" minOccurs="0" maxOccurs="1"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="TableType1" minOccurs="0" maxOccurs="5"> 
        <xs:complexType> 
        <xs:sequence> 
         <xs:element name="teid" type="unixTimestampType"/> 
         <xs:element name="entry" type="eEurocents" maxOccurs="192"/> 
        </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
      <xs:element name="request" minOccurs="0" maxOccurs="1"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="TableType1" minOccurs="0" maxOccurs="5"> 
        <xs:complexType> 
        <xs:sequence> 
         <xs:element name="timestamp" type="unixTimestampType"/> 
        </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Ich habe das mehrmals vor der Verwendung von python3 pyxb/pyxbgen und Importieren der Bindungen lib getan.

Jetzt habe ich das gleiche mit einer neuen Version der Xsd-Datei versucht. Das neue xsd hat in dem Apijekt zwei Arten von Objekten, Anfragen und Antworten. Der Typ TableType1 ist für Antwort und Anforderungen unterschiedlich definiert. Aber in der Binding-Bibliothek sind die inneren Typen der Anfragen und Antworten für mich nicht zugänglich.

Was ich tun möchte, ist eine XML-Zeichenfolge für ein Apiobject mit einer Antwort, die eine TableType1 enthält. Aber da ich nicht auf das TableType1-Objekt zugreifen kann, kann ich es weder auffüllen noch in die Antwort des apiobject einfügen.

Wie kann ich eine gültige Apiobject-Antwort mit TableType1 erstellen?

PS: Einige Xml-Editor sagt das Xsd ist gültig. Aber pyxb kann keine Beispiel-XML-Datei mit dem xsd Schema importieren ...

+0

[dies] (http://stackoverflow.com/questions/17584287/unable-to-bind-to-pyxb-classes-mit-nested -anonymous-types? rq = 1) bietet eine Antwort, aber ich sehe nicht, wie dies meinen inneren komplexen Typ mit den richtigen Objekten füllen wird !? – Jochen

Antwort

0

Die link in meinem Kommentar zu den Fragen bietet in der Tat die Lösung für die Frage. Wenn Ihre pyxb-generierte Datei einfach Bindung genannt wird, können Sie jedes Objekt mit pyxb.BIND (...) generieren.

import binding 
import pyxb 

xml_object = binding.apiobject() 
xml_object.header = pyxb.BIND() 
# Now xml_object.header offers you the attributes you would expect from xsd file. 
# You can create your objects from the binding and assign it to your object. 
xml_object.header.A = binding.eEurocents(1234) 

pyxb ist sogar schlau genug, um das richtige Objekt aus der Hierarchie auszuwählen. Es wird also auch für TableType1 funktionieren und das richtige Objekt entsprechend den Anforderungen auswählen.

xml_object.request = pyxb.BIND() 
xml_object.request.TableType1 = pyxb.BIND() 

Da dies im Anforderungskontext ist, müssen Sie nur einen Zeitstempel festlegen. Um an die Timestamp-Sequenz anzuhängen, müssen Sie das entsprechende Element Ihrer Supersequenz abrufen und an diese anhängen. Sounds verdrahtet, aber mit dem Beispiel xsd versuchen sollte klären ...

Verwandte Themen