2014-06-23 2 views
0

PyXB를 사용하여 익명의 복잡한 유형이있는 XSD에서 모듈을 생성 할 수 있습니까? 기본 유형 및 제약 조건 검사에는 기본 유형이 있습니까? 제 3 자 (익명으로) XSD를 사용PyXB : 좀 더 엄격한 익명 형식 생성하기

: 여기



는 지금까지 관리했습니다 무엇

> pyxbgen -u Foo.xsd -m Foo 
Python for http://www.foo.com requires 1 modules 
> ls 
Foo.py Foo.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> 

그런 다음 파이썬 인터프리터에서 ResultSet 인스턴스를 만들고아래에 항목을 만들 수있었습니다. 0 :

> 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]의 회원과 상호 작용할 수 있습니다. 이 익명 complexTypecode 요소가 의 속성이있다하더라도, 그것을 받아 들일 것이다

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

과 :

는하지만 날 귀찮게하는 것은 나도 할 수 있다는 것입니다. 필자는 StackOverflow에 관한 문서 및 기타 질문을 통해 PyXB가 데이터 형식을 즉각적으로 리버스 엔지니어링하려고 시도하고 있음을 알았습니다. 따라서 허용 범위를 설명 할 수 있습니다.

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

를하고 누락 된 매개 변수에 대한 불평이 : 내가 기본적으로 말을 할 수 있도록 전 과정에 뭔가를 오버레이 할 수 있다면 원하는

. 지금까지 나는 pyxb.BIND()의 결과를 적절한 매개 변수와 함께 반환하는 자체 함수를 작성하는 것에 대해 혼란 스러웠다. 그러나 이것은 상당한 수준의 수동 개입을 의미한다.

PyXB가 자동으로 그러한 지능을 만들 수있는 방법이 있습니까?

답변

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'))