0

PyXB を使用して、基本的な型チェックと制約チェックを持つことができる匿名の複合型を持つ XSD からモジュールを生成することは可能ですか?



これが私がこれまでに管理したものです:

サードパーティ (匿名) XSD の使用:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.foo.com" xmlns="http://www.foo.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ResultSet">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" minOccurs="0" name="Bar">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" name="code" type="xs:string"/>
              <xs:element minOccurs="0" name="description" type="xs:string"/>
              <xs:element minOccurs="0" name="name" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="href" type="xs:string"/>
            <xs:attribute name="id" type="xs:string"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

私はpythonモジュールを生成しました:

> pyxbgen -u Foo.xsd -m Foo
Python for http://www.foo.com requires 1 modules
> ls
Foo.py  Foo.xsd

次に、Python インタープリターで、ResultSetインスタンスを作成し、下にエントリを作成できましたBar

> python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyxb
>>> import Foo
>>> Foo
<module 'Foo' from 'Foo.py'>
>>> rs = Foo.ResultSet()
>>> rs
<Foo.CTD_ANON object at 0x7f7360834950>
>>> rs.Bar
<pyxb.binding.content._PluralBinding object at 0x7f7360834a90>

>>> rs.Bar.append( pyxb.BIND( name='a', code='b', description ='c' ) )
>>> rs.Bar
<pyxb.binding.content._PluralBinding object at 0x7f39f1018a90>
>>> [x for x in rs.Bar ]
[<Foo.CTD_ANON_ object at 0x7f39f1018b90>]

のメンバーと交流することもできrs.Bar[0]ます。

しかし、私が気になるのは、次のこともできるということです。

>>> rs.Bar.append( pyxb.BIND( name='a'  ) )

code匿名の要素complexTypeが の属性を持っていても、それを受け入れますminOccurs="1"。ドキュメントを読んだり、StackOverflow に関するその他の質問を読んだりして、PyXB がその場でデータ型をリバース エンジニアリングしようとしていることがわかりました。

可能であれば、プロセス全体に何かを重ねて、基本的に次のように言えるようにしたいと思います。

>>> rs.Bar.append( Something( name='a', code='b' ) )

不足しているパラメーターについて不平を言うようにします。これまでのところ、適切なパラメーターを使用して結果を返す独自の関数を作成することについて熟考してきましたpyxb.BIND()が、これはかなりの程度の手動介入を意味します。

PyXBでそのようなスマートを自動的に作成する方法はありますか?

4

1 に答える 1

1

PyXB は、リバース エンジニアリングのために許容的ではありませんが、構成時に要素を検証せず、要素に割り当てられたときに複合型を検証しないためです。これは、必要なコンテンツを要素に割り当てるために複数の Python ステートメントが必要になる場合があるためですpyxb.BIND()

たとえば、次のようにしてコードを完成させることができます。

rs.Bar.append( pyxb.BIND( name='a'  ) )
rs.Bar[-1].code = '42'

どの時点rsで有効になります。

オブジェクトが追加された時点で検証を実行する場合は、追加された要素を検証する中間関数を使用する必要があります。以下は、着信パラメーターが未解決のpyxb.BIND構造である可能性がある状況でこれを行う方法を示しています。

import pyxb
import Foo

def checkedAppendBar(rs, bar):
    rs.Bar.append(bar)
    bar = rs.Bar[-1]
    try:
        bar.validateBinding()
    except pyxb.ValidationError as e:
        print e.details()
    return bar

rs = Foo.ResultSet()
# Fails:
#bar = checkedAppendBar(rs, pyxb.BIND(name='a'))
bar = checkedAppendBar(rs, pyxb.BIND(name='a', code='42'))
于 2014-07-08T11:12:37.950 に答える