2016-08-09 48 views
0
nicht instanziieren

Ich versuche, meine ersten Schritte mit PyXB zu machen, habe aber das Problem, dass ich das Element Paket nicht erstellen kann. Ich habe die Beispiele durchgelesen, kann aber keine weiteren Informationen dazu finden. Wenn das abstrakte Element eine Ebene tiefer ist, scheint es eine Lösung zu geben, aber hier ist es auf der obersten Ebene.PyXB: Kann den abstrakten Typ

Kann mir jemand dabei helfen?

Erstellen von Klassen

pyxbgen -u arelda_v4.xsd -m all 
WARNING:pyxb.binding.generate:Complex type {http://bar.admin.ch/arelda/v4}paket renamed to paket_ 
Python for http://bar.admin.ch/arelda/v4 requires 1 modules 

Try paket Element zu erstellen:

Python 2.7.5 (default, Oct 11 2015, 17:47:16) 
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import all 
>>> paket = all.paket() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/site-packages/pyxb/binding/basis.py", line 1600, in __call__ 
    rv = self.typeDefinition().Factory(*args, **kw) 
    File "/usr/lib/python2.7/site-packages/pyxb/binding/basis.py", line 305, in Factory 
    rv = cls._DynamicCreate(*args, **kw) 
    File "/usr/lib/python2.7/site-packages/pyxb/binding/basis.py", line 677, in _DynamicCreate 
    return ctor(*args, **kw) 
    File "/usr/lib/python2.7/site-packages/pyxb/binding/basis.py", line 2075, in __init__ 
    raise pyxb.AbstractInstantiationError(type(self), location, dom_node) 
pyxb.exceptions_.AbstractInstantiationError: Cannot instantiate abstract type {http://bar.admin.ch/arelda/v4}paket directly 

XSD

<xs:element name="paket" type="paket"> 
    <xs:key name="ordnungssystempositionIdKey"> 
     <xs:annotation> 
      <xs:documentation>Das Element id in der Entität Ordnungssystemposition muss eindeutig sein.</xs:documentation> 
     </xs:annotation> 
     <xs:selector xpath=".//arelda:ordnungssystemposition"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    <xs:key name="dossierIdKey"> 
     <xs:annotation> 
      <xs:documentation>Das Element id in der Entität Dossier muss eindeutig sein.</xs:documentation> 
     </xs:annotation> 
     <xs:selector xpath=".//arelda:dossier"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    <xs:key name="dokumentIdKey"> 
     <xs:annotation> 
      <xs:documentation>Das Element id in der Entität Dokument muss eindeutig sein.</xs:documentation> 
     </xs:annotation> 
     <xs:selector xpath=".//arelda:dokument"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    <xs:key name="archivischeNotizIdKey"> 
     <xs:annotation> 
      <xs:documentation>Das Element id in der Entität ArchivischeNotiz muss eindeutig sein.</xs:documentation> 
     </xs:annotation> 
     <xs:selector xpath=".//arelda:archivischeNotiz"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
</xs:element> 

<xs:complexType name="paket" abstract="true"> 

XML

<?xml version="1.0" encoding="UTF-8"?> 
<v4:paket schemaVersion="4.0" xsi:type="v4:paketSIP" xmlns:v4="http://bar.admin.ch/arelda/v4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <v4:paketTyp>SIP</v4:paketTyp> 
</v4:paket> 

Dank Manuel

Antwort

1

Der Typ paket ist abstrakt, aber diese Art wird in einer Element-Deklaration, gegen die die v4 verwendet: paket Element validiert. Dies ist für abstrakte Typen nicht erlaubt. Abstrakte Typen können nur abgeleitet und ihr konkreter abgeleiteter Typ zur Validierung verwendet werden.

Wenn Sie die Kontrolle über die XSD-Dokument haben, abstrakt zu falsch oder Weglassen dieses Attribut einstellen, sollte der Fehler weggehen.

<xs:complexType name="paket" abstract="false"> 
    ... 
</xs:complexType>