pyxb-users Mailing List for PyXB: Python XML Schema Bindings
Brought to you by:
pabigot
You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(4) |
Sep
(3) |
Oct
|
Nov
(11) |
Dec
(17) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(17) |
Feb
(3) |
Mar
|
Apr
|
May
(7) |
Jun
(1) |
Jul
(7) |
Aug
(3) |
Sep
|
Oct
(7) |
Nov
(4) |
Dec
(2) |
2011 |
Jan
(3) |
Feb
(4) |
Mar
|
Apr
(4) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(14) |
Nov
|
Dec
|
2012 |
Jan
(8) |
Feb
(7) |
Mar
(5) |
Apr
(5) |
May
(16) |
Jun
(5) |
Jul
(3) |
Aug
(2) |
Sep
|
Oct
|
Nov
(3) |
Dec
(1) |
2013 |
Jan
(4) |
Feb
(9) |
Mar
(8) |
Apr
(5) |
May
|
Jun
|
Jul
(2) |
Aug
|
Sep
(5) |
Oct
(9) |
Nov
(2) |
Dec
|
2014 |
Jan
|
Feb
(19) |
Mar
(4) |
Apr
(3) |
May
(3) |
Jun
(1) |
Jul
|
Aug
(3) |
Sep
|
Oct
(3) |
Nov
|
Dec
(3) |
2015 |
Jan
|
Feb
(3) |
Mar
(1) |
Apr
(10) |
May
(3) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(4) |
Nov
|
Dec
(1) |
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(3) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2017 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Peter A. B. <pa...@pa...> - 2018-04-11 11:07:06
|
To all five subscribers to this list(apparently): Please see: https://github.com/pabigot/pyxb/issues/100 Peter |
From: Emezeta <ze...@in...> - 2017-02-01 03:10:38
|
I'm dealing with a third party XSD schema to generate python classes. The application will parse XML files to extract data. It's not about creating xml files. The generated code works fine when parsing any valid `xml` data file. Anyway the results differ somewhat than expected. I got about 50 class names which look like CTD_ANON... I guess this is due to the extensive use of anonymous types in the schema. In turn I can not bind them because I don't know how to. On the other hand perhaps everything is because of my own ignorance. Well, I can not deny that either. In case someone is interested the complete xsd schema and other details here. https://bitbucket.org/emezeta/pyefuy So to generate the classes: $~ pyxbgen -u EnvioCFE_entreEmpresas.xsd -m eceelib produces three files: _ds.py _xenc.py eceelib.py then: $~ python Python 2.7.9 (default, Jun 29 2016, 13:08:31) [GCC 4.9.2] on linux2 >>> >>> import eceelib >>> with open("./xml/Sob_111111111111_20161207_99999.xml") as f: ... xml_str = f.read() ... >>> xml_doc = eceelib.CreateFromDocument(xml_str) results in: Python 2.7.9 (default, Jun 29 2016, 13:08:31) [GCC 4.9.2] on linux2 >>> >>> import eceelib >>> with open("./xml/Sob_111111111111_20161207_99999.xml") as f: ... xml_str = f.read() ... >>> xml_doc = eceelib.CreateFromDocument(xml_str) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "eceelib.py", line 71, in CreateFromDocument saxer.parse(io.BytesIO(xmld)) File "/usr/lib/python2.7/xml/sax/expatreader.py", line 107, in parse xmlreader.IncrementalParser.parse(self, source) File "/usr/lib/python2.7/xml/sax/xmlreader.py", line 123, in parse self.feed(buffer) File "/usr/lib/python2.7/xml/sax/expatreader.py", line 210, in feed self._parser.Parse(data, isFinal) File "/usr/lib/python2.7/xml/sax/expatreader.py", line 351, in end_element_ns self._cont_handler.endElementNS(pair, None) File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/saxer.py", line 388, in endElementNS binding_object = this_state.endBindingElement() File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/saxer.py", line 226, in endBindingElement self.__constructElement(self.__delayedConstructor, self.__attributes, args) File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/saxer.py", line 116, in __constructElement self.__bindingInstance = new_object_factory(*content, **kw) File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/basis.py", line 1613, in __call__ args = [ self.compatibleValue(args[0], **kw) ] File "/usr/local/lib/python2.7/dist-packages/pyxb/binding/basis.py", line 1635, in compatibleValue raise pyxb.ElementChangeError(self, value) pyxb.exceptions_.ElementChangeError: Value 2 for element {http://cfe.dgi.gub.uy}TipoDocRecep incompatible with fixed content >>> full ipython trace image http://bit.ly/2kSoRVa Then I slightly modified the "CFEType.xsd" file to deal with this issue despite '2' being the proper `fixed` value in both xsd schema and xml data file. My workarround on "CFEType.xsd" file was: < <xs:element name="TipoDocRecep" type="DGICFE:DocType" fixed="2"> --- > <xs:element name="TipoDocRecep" type="DGICFE:DocType"> # this line works Now the xml file is parsed smoothly. >>> xml_doc = eceelib.CreateFromDocument(xml_str) >>> As far as I can get things seems to go fine, This is a small experience with pyxb, hopefully useful. I'll be glad receiving any suggestion, insights, fixes to improve and learn or simply find a better way doing so. Thanks, emezeta ps: pyxb.exceptions_.ElementChangeError: exception as an issue can be seen here http://bit.ly/2kSQAoV |
From: Test U. <mod...@gm...> - 2016-11-10 15:54:50
|
Hello group, I have just upgraded from *1.2.4* to Pyxb *1.2.5* and run into a problem with generating XML's. Version 1.2.4 produced xml's that i exactly that i wanted. In current release i am having additional namespace/attributes in output xml that i want to remove. This is *xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance <http://www.w3.org/2001/XMLSchema-instance>"* I use common XSD schema: ~~~ <xs:schema xmlns=" http://www.six-interbank-clearing.com/de/pacs.008.001.02.ch.01" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace=" http://www.six-interbank-clearing.com/de/pacs.008.001.02.ch.01" elementFormDefault="qualified"> (...) ~~~ my Python2.7 code: ~~~ #doc = pacs008.Document() #doc.FIToFICstmrCdtTrf = fitoficstmrcdttrf # Namespace nsm = "http://www.six-interbank-clearing.com/de/pacs.008.001.02.ch.01" pyxb.utils.domutils.BindingDOMSupport.SetDefaultNamespace(nsm) try: doc.validateBinding() print doc.toDOM().toprettyxml(encoding='utf-8') except pyxb.ValidationError as e: logger.error(e.details()) ~~~ *PyXB 1.2.4* output xml: ~~~ <?xml version="1.0" encoding="utf-8"?> <Document xmlns=" http://www.six-interbank-clearing.com/de/pacs.008.001.02.ch.01"> <FIToFICstmrCdtTrf> <GrpHdr> <MsgId>10112016014400-7b183cf30532</MsgId> (...) ~~~ *PyXB 1.2.5* output xml: ~~~ <?xml version="1.0" encoding="utf-8"?> <Document xmlns=" http://www.six-interbank-clearing.com/de/pacs.008.001.02.ch.01" *xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance <http://www.w3.org/2001/XMLSchema-instance>"*> <FIToFICstmrCdtTrf *xsi:type="FIToFICustomerCreditTransferV02_CH_pacs008"*> <GrpHdr xsi:type="GroupHeader33_CH_pacs008"> <MsgId>10112016032100-8e23476821ef</MsgId> (...) ~~~ My goal is to remove unneccesery (for my case) "xsi:type" attributes that are added to many of output xml elements. Was playing with pyxb.utils.domutils.BindingDOMSupport() class but with no success. Could You help me on that? Regards, Ryku |
From: Ricardo F. S. G. da <ric...@gm...> - 2016-05-23 16:38:13
|
Hello Peter, list I'm trying to create a SOAP request to send to a web service that expects a wsse:UsernameToken element in the SOAP header. Following the OASIS docs here[1] I'm trying to create the UsernameToken element with PyXB. I'm using something like the following: from pyxb.bundles.wssplat import wsse unt = wsse.UsernameToken() unt.Username = "myuser" unt.Password = wsse.Password("mypass", Type="PasswordText") print(unt.toDOM().toprettyxml()) # the Password element does not show Which results in: <?xml version="1.0" ?> <ns1:UsernameToken xmlns:ns1=" http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd "> <ns1:Username>ricardogsilva</ns1:Username> </ns1:UsernameToken> The code runs without error, but the wsse.Password element does not appear when I call the toDOM() method. So I guess I'm creating it the wrong way. How would I achieve my goal? [1] - https://www.oasis-open.org/committees/download.php/13392/wss-v1.1-spec-pr-UsernameTokenProfile-01.htm -- ___________________________ ___ __ Ricardo Garcia Silva |
From: Ricardo F. S. G. da <ric...@gm...> - 2016-05-10 00:06:31
|
Cool, thanks a lot! On Tue, May 10, 2016 at 12:31 AM, Peter Bigot <pa...@gm...> wrote: > QName values must be expanded names, incorporating both the namespace and > the local name. > > import pyxb.bundles.opengis.csw_2_0_2 as csw; > > import pyxb.utils.domutils; > pyxb.utils.domutils.BindingDOMSupport.DeclareNamespace(csw.Namespace, > 'csw') > > q1 = csw.Query(typeNames=[csw.Namespace.createExpandedName('Record')]); > q1.ElementSetName = 'brief'; > print q1.toDOM().toprettyxml(); > > > producing > > <?xml version="1.0" ?> > <csw:Query typeNames="csw:Record" xmlns:csw=" > http://www.opengis.net/cat/csw/2.0.2"> > <csw:ElementSetName>brief</csw:ElementSetName> > </csw:Query> > > > On Mon, May 9, 2016 at 10:20 AM, Ricardo Filipe Soares Garcia da < > ric...@gm...> wrote: > >> Hi Peter, all >> >> I'm trying to use pyxb with the opengis schemas to work with the CSW >> 2.0.2 standard[1]. >> I have PyXB 1.2.4 installed with the opengis schemas, which I installed >> following the steps described in the docs[2]. Now I'm trying to create a >> Query element using something like: >> >> from pyxb.bundles.opengis import csw_2_0_2 >> q1 = csw_2_0_2.Query(typenames="csw:Record") >> >> This fails with a QNameResolutionError. I guess I have to tell pyxb about >> the csw prefix somehow, but I've not been able to figure out how to do it. >> >> Interestingly, if I try with: >> >> q1 = csw_2_0_2.Query(typenames="Record") >> >> it does work. however, I do need to be able to also supply the include >> the "csw" prefix as it is mentioned in the standard. >> >> How can I do it? >> >> >> Best regards >> >> >> [1] - http://www.opengeospatial.org/standards/cat >> [2] - >> https://github.com/pabigot/pyxb/blob/next/pyxb/bundles/opengis/README.txt >> >> -- >> ___________________________ ___ __ >> Ricardo Garcia Silva >> >> >> ------------------------------------------------------------------------------ >> Find and fix application performance issues faster with Applications >> Manager >> Applications Manager provides deep performance insights into multiple >> tiers of >> your business applications. It resolves application problems quickly and >> reduces your MTTR. Get your free trial! >> https://ad.doubleclick.net/ddm/clk/302982198;130105516;z >> _______________________________________________ >> pyxb-users mailing list >> pyx...@li... >> https://lists.sourceforge.net/lists/listinfo/pyxb-users >> >> > -- ___________________________ ___ __ Ricardo Garcia Silva |
From: Ricardo F. S. G. da <ric...@gm...> - 2016-05-09 15:20:28
|
Hi Peter, all I'm trying to use pyxb with the opengis schemas to work with the CSW 2.0.2 standard[1]. I have PyXB 1.2.4 installed with the opengis schemas, which I installed following the steps described in the docs[2]. Now I'm trying to create a Query element using something like: from pyxb.bundles.opengis import csw_2_0_2 q1 = csw_2_0_2.Query(typenames="csw:Record") This fails with a QNameResolutionError. I guess I have to tell pyxb about the csw prefix somehow, but I've not been able to figure out how to do it. Interestingly, if I try with: q1 = csw_2_0_2.Query(typenames="Record") it does work. however, I do need to be able to also supply the include the "csw" prefix as it is mentioned in the standard. How can I do it? Best regards [1] - http://www.opengeospatial.org/standards/cat [2] - https://github.com/pabigot/pyxb/blob/next/pyxb/bundles/opengis/README.txt -- ___________________________ ___ __ Ricardo Garcia Silva |
From: b.blundell <b.b...@qm...> - 2015-12-01 16:54:11
|
Hello there I have an odd use-case (at least I think so). I'm trying to create a tool to simplify the creation of XML files. These files need to conform to XSLT rules. My plan is to use pyxb and read in the XSLT - then present the set of classes that have been generated to the user. I envisage a drag/drop + form interface. Its early days yet but I've started to look at enumerating the classes in pyxb. So far I have this: model = {} model['complex_types'] = [] for name, obj in inspect.getmembers(cdisc_schema): if inspect.isclass(obj): if issubclass(obj,pyxb.binding.basis.complexTypeDefinition): model['complex_types'].append(obj) I'm attempting to create lists of the different binding classes which I can then export to an application in something like flask. This appears to work but it seems somewhat clunky. Can anyone think of a better way to see what classes and datatypes pyxb has made? Cheers Ben -- Research & Scientific Programmer CB204, The Queens Building, Queen Mary University of London +44 (0)20 7882 2274 http://keys.gnupg.net/pks/lookup?search=Benjamin+Blundell |
From: <Pet...@mo...> - 2015-10-27 13:59:51
|
Hi Guys, I am having an issue with pyxb. I keep getting this error ContentNondeterminismExceededError: Nondeterminism exceeded validating {http://hadoop-ui.mo-data.com/schema/datapub-protocol}ProjectionsType I don't get it what might be causing this issue, since it used to work. I assume the issue is with how pyxb handles the xsd, please find it attached to this message. I am using the latest version of pyxb. Any help is greatly appreciated. Regards, Peter |
From: Ricardo F. S. G. da <ric...@gm...> - 2015-10-09 13:11:16
|
Cool Thanks Peter :) On Fri, Oct 9, 2015 at 12:33 PM, Peter Bigot <pa...@gm...> wrote: > Normally you would simply use the contained element as an object, and if > you needed to know the type use standard Python operations. For example: > > >>> print(fes_2_0.PropertyIsEqualTo == e._element()) > True > >>> e = f1.content()[0] > >>> print type(e) > <class 'pyxb.bundles.opengis.raw.fes_2_0.BinaryComparisonOpType'> > >>> print isinstance(e, fes_2_0.BinaryComparisonOpType) > True > > However it appears that schema encodes the type of the comparison in the > element tag itself rather than as an attribute of the type. For that you > need to compare the element against the available options, using a > back-door function to get the element associated with the object: > > >>> print e._element() > Element {http://www.opengis.net/fes/2.0}PropertyIsEqualTo > >>> print fes_2_0.PropertyIsEqualTo == e._element() > True > > Peter > > On Thu, Oct 8, 2015 at 7:40 PM, Ricardo Filipe Soares Garcia da < > ric...@gm...> wrote: > >> Hi all >> >> I'm trying to use PyXB with the opengis fes_2_0 schema. >> >> I've installed the schemas as per the instructions in [1] and they seem >> to work OK. >> Now I am parsing one of the examples present in the OGC schema >> repository[2]. I am able to parse the example, as in: >> >> >>> import pyxb.bundles.opengis.fes_2_0 as fes_2_0 >> >>> f1 = >> fes_2_0.CreateFromDocument(open("/home/ricardo/Downloads/SCHEMAS_OPENGIS_NET/filter/2.0/examples/3.2.1/filter01.xml").read()) >> >> >> Now I'd like to know what type of filter I have just parsed, but I cannot >> seem to find any way to do it (other than calling the .toxml() method). >> >> >> >>> predicate = f1.content()[0] # now what type of predicate is this? >> >> If I call >> >> >>> predicate.toxml() >> u'<?xml version="1.0" ?><ns1:PropertyIsEqualTo xmlns:ns1=" >> http://www.opengis.net/fes/2.0 >> "><ns1:ValueReference>SomeProperty</ns1:ValueReference><ns1:Literal>100</ns1:Literal></ns1:PropertyIsEqualTo>' >> >> I can see that it is a fes:PropertyIsEqualTo operator. However I am not >> finding any other way to extract this information from the object. How can >> retrieve it? >> >> Thanks a lot >> >> >> [1] - >> https://github.com/pabigot/pyxb/blob/next/pyxb/bundles/opengis/README.txt >> [2] - http://schemas.opengis.net/filter/2.0/examples/3.2.1/filter01.xml >> >> -- >> ___________________________ ___ __ >> Ricardo Garcia Silva >> >> >> ------------------------------------------------------------------------------ >> >> _______________________________________________ >> pyxb-users mailing list >> pyx...@li... >> https://lists.sourceforge.net/lists/listinfo/pyxb-users >> >> > -- ___________________________ ___ __ Ricardo Garcia Silva |
From: Ricardo F. S. G. da <ric...@gm...> - 2015-10-09 00:40:28
|
Hi all I'm trying to use PyXB with the opengis fes_2_0 schema. I've installed the schemas as per the instructions in [1] and they seem to work OK. Now I am parsing one of the examples present in the OGC schema repository[2]. I am able to parse the example, as in: >>> import pyxb.bundles.opengis.fes_2_0 as fes_2_0 >>> f1 = fes_2_0.CreateFromDocument(open("/home/ricardo/Downloads/SCHEMAS_OPENGIS_NET/filter/2.0/examples/3.2.1/filter01.xml").read()) Now I'd like to know what type of filter I have just parsed, but I cannot seem to find any way to do it (other than calling the .toxml() method). >>> predicate = f1.content()[0] # now what type of predicate is this? If I call >>> predicate.toxml() u'<?xml version="1.0" ?><ns1:PropertyIsEqualTo xmlns:ns1=" http://www.opengis.net/fes/2.0 "><ns1:ValueReference>SomeProperty</ns1:ValueReference><ns1:Literal>100</ns1:Literal></ns1:PropertyIsEqualTo>' I can see that it is a fes:PropertyIsEqualTo operator. However I am not finding any other way to extract this information from the object. How can retrieve it? Thanks a lot [1] - https://github.com/pabigot/pyxb/blob/next/pyxb/bundles/opengis/README.txt [2] - http://schemas.opengis.net/filter/2.0/examples/3.2.1/filter01.xml -- ___________________________ ___ __ Ricardo Garcia Silva |
From: Miguel G. <mg...@gm...> - 2015-10-05 22:05:24
|
I've been using PyXB to generate XML code from XSD templates for a while, and it works most of the time. But today I've found a pretty serious bug in Pattern validation. <xs:simpleType name="tpEmail"> <xs:annotation> <xs:documentation>Tipo E-mail.</xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:minLength value="0" /> <xs:maxLength value="75" /> <xs:whiteSpace value="collapse" /> <xs:pattern value="([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})" /> </xs:restriction> </xs:simpleType> The pattern above failed to validate the email r_...@ho..., because of the underscore. The problema is: the pattern allows an underscore, and I've tested it directly on a python shell: >>> m = re.match("([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})", "r_...@ho...") >>> m.group() 'r_...@ho...' Digging the code, it seems that the problem is the XMLToPython, that is supposed to translate an XML pattern to a Python Pattern. The _PatternElement class uses it to build the python regexp object (facets.py, line 388). When I removed this conversion, everything worked. Can someone help to understand if this is really a bug? Tks Miguel Galves - Engenheiro de Computação "Não sabendo que era impossível, ele foi lá e fez..." "Stay hungry, stay foolish" |
From: Peter B. <bi...@ac...> - 2015-05-16 16:38:38
|
For this, generally XML attributes are not namespaced. If you want them to be namespaced you have to explicitly set either attributeFormDefault="qualified" in the schema root or form="qualified" in the attribute definition. Then you have to add a namespace prefix to the attribute reference in your document. These work: <?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="http://carfax.org.uk/namespace" xmlns:tns="http://carfax.org.uk/namespace" attributeFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="sthType"> <xsd:attribute name="foo" type="xsd:string"/> </xsd:complexType> <xsd:element name="something" type="tns:sthType"/> </xsd:schema> <?xml version="1.0" encoding="UTF-8"?> <something xmlns:ns="http://carfax.org.uk/namespace" xmlns="http://carfax.org.uk/namespace" ns:foo="bar"> </something> If you read the original document with this schema you'll get an unrecognized attribute error, and vice-versa. Peter On Sat, May 16, 2015 at 9:40 AM, Hugo Mills <hu...@ca...> wrote: > The only concern I have, which is more likely to be a basic XML > question than a PyXB-specific one, is that only the elements in the > schema are namespaced, not the attributes, with the exception of the > xsd:targetNamespace attribute. I can't get pyxbgen to run with xsd: > namespaces on the attributes of the schema, nor with the xsd: > namespace missing from the xsd:targetNamespace attribute. This > confuses me somewhat, in my primitive understanding of XML Schema. > > What am I doing wrong in all of this? > > Thanks, > Hugo. > > -- > Hugo Mills | The problem with programmers and the law is not > that > hugo@... carfax.org.uk | they treat laws as code, but that they don't > http://carfax.org.uk/ | understand the VM it runs on. > PGP: E2AB1DE4 | > > > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y > _______________________________________________ > pyxb-users mailing list > pyx...@li... > https://lists.sourceforge.net/lists/listinfo/pyxb-users > > |
From: Peter B. <bi...@ac...> - 2015-05-16 16:24:26
|
There are two errors in your schema. First, the targetNamespace attribute is not in the http://www.w3.org/2001/XMLSchema namespace and should not be so-qualified. The effect is that your declared type and element is {}sthType and {}something. Your document looks for element { http://carfax.org.uk/namespace}something but that element doesn't exist so PyXB complains. Once you fix that the second error becomes clear: Because the schema doesn't have a default namespace and you don't have a namespace declaration for your target namespace, the bindings can't be generated because the element declaration uses an unqualified name sthType in a context where a namespace can't be inferred. This schema should do what you want without changing your program or document. <?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="http://carfax.org.uk/namespace" xmlns:tns="http://carfax.org.uk/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="sthType"> <xsd:attribute name="foo" type="xsd:string"/> </xsd:complexType> <xsd:element name="something" type="tns:sthType"/> </xsd:schema> Peter On Sat, May 16, 2015 at 9:40 AM, Hugo Mills <hu...@ca...> wrote: > Hi, I'm having trouble getting namespaced documents to work. > > I have this (test) schema: > > <?xml version="1.0" encoding="UTF-8"?> > > <xsd:schema xsd:targetNamespace="http://carfax.org.uk/namespace" > xmlns:xsd="http://www.w3.org/2001/XMLSchema"> > <xsd:complexType name="sthType"> > <xsd:attribute name="foo" type="xsd:string"/> > </xsd:complexType> > <xsd:element name="something" type="sthType"/> > </xsd:schema> > > and this XML document, which should, I believe, conform to the schema: > > <?xml version="1.0" encoding="UTF-8"?> > > <something xmlns="http://carfax.org.uk/namespace" foo="bar"> > </something> > > I've generated a module (PyXB 1.2.4): > > $ pyxbgen -u schema.xsd -m sth > Python for AbsentNamespace0 requires 1 modules > > and I'm now trying to open the document: > > #!/usr/bin/python3 > import sth > doc = sth.CreateFromDocument(open("doc.xml", "r").read()) > print(doc) > > This gives me: > > $ ./test > Traceback (most recent call last): > File > "/usr/local/lib/python3.4/dist-packages/pyxb/namespace/__init__.py", line > 307, in categoryMap > return self.__categoryMap[category] > KeyError: 'elementBinding' > > During handling of the above exception, another exception occurred: > > Traceback (most recent call last): > File "./test", line 5, in <module> > doc = sth.CreateFromDocument(open("doc.xml", "r").read()) > File "/home/hrm/rostercare/temp/sth.py", line 62, in CreateFromDocument > saxer.parse(io.BytesIO(xmld)) > File "/usr/lib/python3.4/xml/sax/expatreader.py", line 107, in parse > xmlreader.IncrementalParser.parse(self, source) > File "/usr/lib/python3.4/xml/sax/xmlreader.py", line 123, in parse > self.feed(buffer) > File "/usr/lib/python3.4/xml/sax/expatreader.py", line 207, in feed > self._parser.Parse(data, isFinal) > File "/usr/lib/python3.4/xml/sax/expatreader.py", line 341, in > start_element_ns > AttributesNSImpl(newattrs, qnames)) > File "/usr/local/lib/python3.4/dist-packages/pyxb/binding/saxer.py", > line 324, in startElementNS > element_binding = name_en.elementBinding() > File > "/usr/local/lib/python3.4/dist-packages/pyxb/namespace/__init__.py", line > 104, in __getattr__ > category_value = ns.categoryMap(name).get(self.localName()) > File > "/usr/local/lib/python3.4/dist-packages/pyxb/namespace/__init__.py", line > 309, in categoryMap > raise pyxb.NamespaceError(self, '%s has no category %s' % (self, > category)) > pyxb.exceptions_.NamespaceError: http://carfax.org.uk/namespace has no > category elementBinding > > Now, I'm guessing that the problem is indicated with the "Python > for AbsentNamespace0 requires 1 module" message from pyxbgen, but I'm > at a loss to see what the problem is. > > The only concern I have, which is more likely to be a basic XML > question than a PyXB-specific one, is that only the elements in the > schema are namespaced, not the attributes, with the exception of the > xsd:targetNamespace attribute. I can't get pyxbgen to run with xsd: > namespaces on the attributes of the schema, nor with the xsd: > namespace missing from the xsd:targetNamespace attribute. This > confuses me somewhat, in my primitive understanding of XML Schema. > > What am I doing wrong in all of this? > > Thanks, > Hugo. > > -- > Hugo Mills | The problem with programmers and the law is not > that > hugo@... carfax.org.uk | they treat laws as code, but that they don't > http://carfax.org.uk/ | understand the VM it runs on. > PGP: E2AB1DE4 | > > > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y > _______________________________________________ > pyxb-users mailing list > pyx...@li... > https://lists.sourceforge.net/lists/listinfo/pyxb-users > > |
From: Hugo M. <hu...@ca...> - 2015-05-16 14:40:57
|
Hi, I'm having trouble getting namespaced documents to work. I have this (test) schema: <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xsd:targetNamespace="http://carfax.org.uk/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="sthType"> <xsd:attribute name="foo" type="xsd:string"/> </xsd:complexType> <xsd:element name="something" type="sthType"/> </xsd:schema> and this XML document, which should, I believe, conform to the schema: <?xml version="1.0" encoding="UTF-8"?> <something xmlns="http://carfax.org.uk/namespace" foo="bar"> </something> I've generated a module (PyXB 1.2.4): $ pyxbgen -u schema.xsd -m sth Python for AbsentNamespace0 requires 1 modules and I'm now trying to open the document: #!/usr/bin/python3 import sth doc = sth.CreateFromDocument(open("doc.xml", "r").read()) print(doc) This gives me: $ ./test Traceback (most recent call last): File "/usr/local/lib/python3.4/dist-packages/pyxb/namespace/__init__.py", line 307, in categoryMap return self.__categoryMap[category] KeyError: 'elementBinding' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "./test", line 5, in <module> doc = sth.CreateFromDocument(open("doc.xml", "r").read()) File "/home/hrm/rostercare/temp/sth.py", line 62, in CreateFromDocument saxer.parse(io.BytesIO(xmld)) File "/usr/lib/python3.4/xml/sax/expatreader.py", line 107, in parse xmlreader.IncrementalParser.parse(self, source) File "/usr/lib/python3.4/xml/sax/xmlreader.py", line 123, in parse self.feed(buffer) File "/usr/lib/python3.4/xml/sax/expatreader.py", line 207, in feed self._parser.Parse(data, isFinal) File "/usr/lib/python3.4/xml/sax/expatreader.py", line 341, in start_element_ns AttributesNSImpl(newattrs, qnames)) File "/usr/local/lib/python3.4/dist-packages/pyxb/binding/saxer.py", line 324, in startElementNS element_binding = name_en.elementBinding() File "/usr/local/lib/python3.4/dist-packages/pyxb/namespace/__init__.py", line 104, in __getattr__ category_value = ns.categoryMap(name).get(self.localName()) File "/usr/local/lib/python3.4/dist-packages/pyxb/namespace/__init__.py", line 309, in categoryMap raise pyxb.NamespaceError(self, '%s has no category %s' % (self, category)) pyxb.exceptions_.NamespaceError: http://carfax.org.uk/namespace has no category elementBinding Now, I'm guessing that the problem is indicated with the "Python for AbsentNamespace0 requires 1 module" message from pyxbgen, but I'm at a loss to see what the problem is. The only concern I have, which is more likely to be a basic XML question than a PyXB-specific one, is that only the elements in the schema are namespaced, not the attributes, with the exception of the xsd:targetNamespace attribute. I can't get pyxbgen to run with xsd: namespaces on the attributes of the schema, nor with the xsd: namespace missing from the xsd:targetNamespace attribute. This confuses me somewhat, in my primitive understanding of XML Schema. What am I doing wrong in all of this? Thanks, Hugo. -- Hugo Mills | The problem with programmers and the law is not that hugo@... carfax.org.uk | they treat laws as code, but that they don't http://carfax.org.uk/ | understand the VM it runs on. PGP: E2AB1DE4 | |
From: Peter B. <bi...@ac...> - 2015-04-14 08:42:13
|
The schemas seem to declare about 1400 distinct types, and 748 top-level elements. You'd need some way to figure out which ones you don't need, then the best path would be to edit the schema to delete the unnecessary elements and types. While PyXB can be used to allow manipulation of XML documents in Python (focus on the XML content), it was mostly intended to allow Python applications to communicate over interfaces that require valid XML (focus on the Python application). Depending on what you're trying to accomplish, you might be better off using a tool like XSLT (if you're transforming JDF documents) or just building a DOM structure manually and running the output through an external validator before passing it to a JDF processor (if you're generating JDF from scratch). For the latter case, you might just use PyXB as a bootstrap step to understand what valid JDF structures look like, then once the application works drop the bindings and generate DOM structures directly. Save PyXB for use as a quality assurance step that what you generate remains valid as the system evolves, if you don't have any other external validators. Peter On Mon, Apr 13, 2015 at 11:03 AM, Kevin Murphy <pk...@gm...> wrote: > Brilliant! Thanks so much for clearing that up for me, I was able to work > from your examples and get things moving again! I definitely was circling > around it but not *quite* grasping what I needed to do. > > Also yes, the schema is incredibly complex. Which is another thing I > wanted to ask you about. Are you aware of any reasonably simple ways to > figure out how to "trim the fat" when generating bindings from a schema > like that? The resulting Python code is nearly 90MB in size and takes > something like 15 seconds just to import. It's not a HUGE deal, and I can > manage with it that way if I need to, but if you have any thoughts or > ideas, I'm all ears. > > Thanks again! > --Kevin > > > Peter Bigot wrote: > > You've got a pretty complex schema there. Part of the problem is that it > allows you a lot of latitude. > > A JDFProcessNode, via the JDFChildElements_ group, includes an optional > ResourcePool element, which in turn is one of the elements of an unbounded > sequence. What this means is that a JDF element can have multiple > ResourcePool elements inside it. That's why you got two of them in the > first attempt: you appended two objects that could be converted (using > pyxb.BIND) into ResourcePool elements by synthesizing a ResourcePool > element from a value that can be content within a ResourcePool element. > > It's also why you can't assign a single ResourcePool directly to the > JDF.ResourcePool attribute: that attribute requires a plural value (the > diagnostic is clearly misleading; the clue is in the exception name). > pyxb.BIND can synthesize the right kind of element given parameters that > could have been passed to that element's "constructor", but it can't > synthesize a list of such elements. > > If you only want one, start with one, as you did, and append it to the > list. Then work with that one. > > Below is how I might express the code I think you're trying to get: > > import jdf.JDF as jdf > > jo = jdf.JDF(ID='job123456', Type='Combined', Status='Waiting') > > # jo supports multiple ResourcePool elements. Use one, and add it to > # the JDF object. > rp = jdf.ResourcePool() > jo.ResourcePool.append(rp) > > # Create a Media and add it to the pool > mo = jdf.Media(ID='main', Class='Consumable', Status='Available') > rp.append(mo) > > # Then add another > rp.append(jdf.Media(ID='perf', Class='Consumable', Status='Available')) > > print jo.toDOM().toprettyxml() > > Or: > > jo = jdf.JDF(ID='job123456', Type='Combined', Status='Waiting') > rp = jdf.ResourcePool(jdf.Media(ID='main', Class='Consumable', > Status='Available'), > jdf.Media(ID='perf', Class='Consumable', > Status='Available')) > jo.ResourcePool.append(rp) > > Both give you the same XML: > > llc[134]$ python test.py > <?xml version="1.0" ?> > <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" xmlns:ns1=" > http://www.CIP4.org/JDFSchema_1_1"> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > <ns1:Media Class="Consumable" ID="perf" Status="Available"/> > </ns1:ResourcePool> > </ns1:JDF> > > > On Fri, Apr 10, 2015 at 2:55 PM, Kevin Murphy <pk...@gm...> wrote: > >> Hello, >> >> I've been checking out PyXB (1.2.4) for a project I'm working on >> involving the JDF XML schema >> (http://www.cip4.org/Schema/JDFSchema_1_4a/JDF.xsd) and in general I >> think PyXB will be a great help, but I'm stumbling over an understanding >> of how to work with ComplexTypes within the PyXB construct. >> >> Here's a simplified example of something I'm trying to do: >> >> So I'm attempting to construct a basic JDF document, and I got about as >> far as trying to build something that looks like this: >> >> <?xml version='1.0' encoding='UTF-8'?> >> <JDF ID="job123456" Status="Waiting" Type="Combined" >> xmlns="http://www.CIP4.org/JDFSchema_1_1"> >> <ResourcePool> >> <Media Class="Consumable" ID="main" Status="Available"/> >> <Media Class="Consumable" ID="perf" Status="Available"/> >> ... >> </ResourcePool> >> </JDF> >> >> using code like this: >> >> import pyxb >> >> from print_services.jdf.schema import jdf >> >> jdf_obj = jdf.JDF() >> >> jdf_obj.ID = "job123456" >> jdf_obj.Type = "Combined" >> jdf_obj.Status = "Waiting" >> >> media_obj = jdf.Media() >> media_obj.ID = "main" >> media_obj.Class = "Consumable" >> media_obj.Status = "Available" >> >> media_obj2 = jdf.Media() >> media_obj2.ID = "perf" >> media_obj2.Class = "Consumable" >> media_obj2.Status = "Available" >> >> jdf_obj.ResourcePool.append(media_obj) >> jdf_obj.ResourcePool.append(media_obj2) >> >> Which yields: >> >> File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", >> line 425, in _CompatibleValue >> raise pyxb.SimpleTypeValueError(cls, value) >> pyxb.exceptions_.SimpleTypeValueError: Type >> {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from >> {http://www.CIP4.org/JDFSchema_1_1}Media_r: >> <print_services.jdf.schema.jdf.Media_r object at 0x109a360d0> >> >> So then I thought... ok, maybe I need to create that ResourcePool object: >> >> jdf_obj.ResourcePool = jdf.ResourcePool() >> >> Nope: >> >> File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", >> line 1618, in compatibleValue >> raise pyxb.SimplePluralValueError(self.typeDefinition(), value) >> pyxb.exceptions_.SimplePluralValueError: Type >> {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from >> {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_: >> <print_services.jdf.schema.jdf.ResourcePool_ object at 0x1073436d0> >> >> Ok, then I went back to the documentation again and started looking into >> this pyxb.BIND() thing... >> >> jdf_obj.ResourcePool.append(pyxb.BIND(media_obj)) >> >> Hey, that worked! >> >> <?xml version="1.0" ?> >> <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" >> xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> >> <ns1:ResourcePool> >> <ns1:Media Class="Consumable" ID="main" Status="Available"/> >> </ns1:ResourcePool> >> </ns1:JDF> >> >> Ok, so let's add a second Media element: >> >> jdf_obj.ResourcePool.append(pyxb.BIND(media_obj2)) >> >> No errors, but ... wait, what? >> >> <?xml version="1.0" ?> >> <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" >> xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> >> <ns1:ResourcePool> >> <ns1:Media Class="Consumable" ID="main" Status="Available"/> >> </ns1:ResourcePool> >> <ns1:ResourcePool> >> <ns1:Media Class="Consumable" ID="perf" Status="Available"/> >> </ns1:ResourcePool> >> </ns1:JDF> >> >> How did I wind up with two ResourcePool elements? >> >> Hrmm, ok, maybe I need to construct the ResourcePool element first, and >> then assign it into the JDF element? >> >> rp_obj = jdf.ResourcePool() >> rp_obj.append(media_obj) >> rp_obj.append(media_obj2) >> >> print rp_obj.toxml() >> >> <?xml version="1.0" ?> >> <ns1:ResourcePool xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> >> <ns1:Media Class="Consumable" ID="main" Status="Available"/> >> <ns1:Media Class="Consumable" ID="perf" Status="Available"/> >> </ns1:ResourcePool> >> >> Looking promising now! >> >> jdf_obj.ResourcePool = rp_obj >> >> File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", >> line 1618, in compatibleValue >> raise pyxb.SimplePluralValueError(self.typeDefinition(), value) >> pyxb.exceptions_.SimplePluralValueError: Type >> {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from >> {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_: >> <print_services.jdf.schema.jdf.ResourcePool_ object at 0x10453d6d0> >> >> Shoot. Maybe I need to do that BIND thing? >> >> jdf_obj.ResourcePool = pyxb.BIND(rp_obj) >> >> File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", >> line 1618, in compatibleValue >> raise pyxb.SimplePluralValueError(self.typeDefinition(), value) >> pyxb.exceptions_.SimplePluralValueError: Type >> {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from: >> <pyxb.BIND object at 0x1032a5910> >> >> >> Hrmm......... >> >> >> So, I definitely feel like I'm dancing around the solution, it's in >> there somewhere, I just don't really understand enough about how these >> bindings are meant to work and I simply can't find a complete example >> that describes what I'm trying to do. I'm really hoping that someone >> can help me out here and point me in the right direction! >> >> Thanks so much, >> --Kevin >> >> >> >> >> ------------------------------------------------------------------------------ >> BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT >> Develop your own process in accordance with the BPMN 2 standard >> Learn Process modeling best practices with Bonita BPM through live >> exercises >> http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- >> event?utm_ >> source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF >> _______________________________________________ >> pyxb-users mailing list >> pyx...@li... >> https://lists.sourceforge.net/lists/listinfo/pyxb-users >> > > |
From: Kevin M. <pk...@gm...> - 2015-04-13 16:03:19
|
Brilliant! Thanks so much for clearing that up for me, I was able to work from your examples and get things moving again! I definitely was circling around it but not *quite* grasping what I needed to do. Also yes, the schema is incredibly complex. Which is another thing I wanted to ask you about. Are you aware of any reasonably simple ways to figure out how to "trim the fat" when generating bindings from a schema like that? The resulting Python code is nearly 90MB in size and takes something like 15 seconds just to import. It's not a HUGE deal, and I can manage with it that way if I need to, but if you have any thoughts or ideas, I'm all ears. Thanks again! --Kevin Peter Bigot wrote: > You've got a pretty complex schema there. Part of the problem is that > it allows you a lot of latitude. > > A JDFProcessNode, via the JDFChildElements_ group, includes an > optional ResourcePool element, which in turn is one of the elements of > an unbounded sequence. What this means is that a JDF element can have > multiple ResourcePool elements inside it. That's why you got two of > them in the first attempt: you appended two objects that could be > converted (using pyxb.BIND) into ResourcePool elements by synthesizing > a ResourcePool element from a value that can be content within a > ResourcePool element. > > It's also why you can't assign a single ResourcePool directly to the > JDF.ResourcePool attribute: that attribute requires a plural value > (the diagnostic is clearly misleading; the clue is in the exception > name). pyxb.BIND can synthesize the right kind of element given > parameters that could have been passed to that element's > "constructor", but it can't synthesize a list of such elements. > > If you only want one, start with one, as you did, and append it to the > list. Then work with that one. > > Below is how I might express the code I think you're trying to get: > > import jdf.JDF as jdf > > jo = jdf.JDF(ID='job123456', Type='Combined', Status='Waiting') > > # jo supports multiple ResourcePool elements. Use one, and add it to > # the JDF object. > rp = jdf.ResourcePool() > jo.ResourcePool.append(rp) > > # Create a Media and add it to the pool > mo = jdf.Media(ID='main', Class='Consumable', Status='Available') > rp.append(mo) > > # Then add another > rp.append(jdf.Media(ID='perf', Class='Consumable', Status='Available')) > > print jo.toDOM().toprettyxml() > > Or: > > jo = jdf.JDF(ID='job123456', Type='Combined', Status='Waiting') > rp = jdf.ResourcePool(jdf.Media(ID='main', Class='Consumable', > Status='Available'), > jdf.Media(ID='perf', Class='Consumable', > Status='Available')) > jo.ResourcePool.append(rp) > > Both give you the same XML: > > llc[134]$ python test.py > <?xml version="1.0" ?> > <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > <ns1:Media Class="Consumable" ID="perf" Status="Available"/> > </ns1:ResourcePool> > </ns1:JDF> > > > On Fri, Apr 10, 2015 at 2:55 PM, Kevin Murphy <pk...@gm... > <mailto:pk...@gm...>> wrote: > > Hello, > > I've been checking out PyXB (1.2.4) for a project I'm working on > involving the JDF XML schema > (http://www.cip4.org/Schema/JDFSchema_1_4a/JDF.xsd) and in general I > think PyXB will be a great help, but I'm stumbling over an > understanding > of how to work with ComplexTypes within the PyXB construct. > > Here's a simplified example of something I'm trying to do: > > So I'm attempting to construct a basic JDF document, and I got > about as > far as trying to build something that looks like this: > > <?xml version='1.0' encoding='UTF-8'?> > <JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns="http://www.CIP4.org/JDFSchema_1_1"> > <ResourcePool> > <Media Class="Consumable" ID="main" Status="Available"/> > <Media Class="Consumable" ID="perf" Status="Available"/> > ... > </ResourcePool> > </JDF> > > using code like this: > > import pyxb > > from print_services.jdf.schema import jdf > > jdf_obj = jdf.JDF() > > jdf_obj.ID = "job123456" > jdf_obj.Type = "Combined" > jdf_obj.Status = "Waiting" > > media_obj = jdf.Media() > media_obj.ID = "main" > media_obj.Class = "Consumable" > media_obj.Status = "Available" > > media_obj2 = jdf.Media() > media_obj2.ID = "perf" > media_obj2.Class = "Consumable" > media_obj2.Status = "Available" > > jdf_obj.ResourcePool.append(media_obj) > jdf_obj.ResourcePool.append(media_obj2) > > Which yields: > > File > "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 425, in _CompatibleValue > raise pyxb.SimpleTypeValueError(cls, value) > pyxb.exceptions_.SimpleTypeValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ > <http://www.CIP4.org/JDFSchema_1_1%7DResourcePool_> cannot be > created from > {http://www.CIP4.org/JDFSchema_1_1}Media_r > <http://www.CIP4.org/JDFSchema_1_1%7DMedia_r>: > <print_services.jdf.schema.jdf.Media_r object at 0x109a360d0> > > So then I thought... ok, maybe I need to create that ResourcePool > object: > > jdf_obj.ResourcePool = jdf.ResourcePool() > > Nope: > > File > "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ > <http://www.CIP4.org/JDFSchema_1_1%7DResourcePool_> cannot be > created from > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ > <http://www.CIP4.org/JDFSchema_1_1%7DResourcePool_>: > <print_services.jdf.schema.jdf.ResourcePool_ object at 0x1073436d0> > > Ok, then I went back to the documentation again and started > looking into > this pyxb.BIND() thing... > > jdf_obj.ResourcePool.append(pyxb.BIND(media_obj)) > > Hey, that worked! > > <?xml version="1.0" ?> > <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > </ns1:ResourcePool> > </ns1:JDF> > > Ok, so let's add a second Media element: > > jdf_obj.ResourcePool.append(pyxb.BIND(media_obj2)) > > No errors, but ... wait, what? > > <?xml version="1.0" ?> > <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > </ns1:ResourcePool> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="perf" Status="Available"/> > </ns1:ResourcePool> > </ns1:JDF> > > How did I wind up with two ResourcePool elements? > > Hrmm, ok, maybe I need to construct the ResourcePool element > first, and > then assign it into the JDF element? > > rp_obj = jdf.ResourcePool() > rp_obj.append(media_obj) > rp_obj.append(media_obj2) > > print rp_obj.toxml() > > <?xml version="1.0" ?> > <ns1:ResourcePool xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > <ns1:Media Class="Consumable" ID="perf" Status="Available"/> > </ns1:ResourcePool> > > Looking promising now! > > jdf_obj.ResourcePool = rp_obj > > File > "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ > <http://www.CIP4.org/JDFSchema_1_1%7DResourcePool_> cannot be > created from > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ > <http://www.CIP4.org/JDFSchema_1_1%7DResourcePool_>: > <print_services.jdf.schema.jdf.ResourcePool_ object at 0x10453d6d0> > > Shoot. Maybe I need to do that BIND thing? > > jdf_obj.ResourcePool = pyxb.BIND(rp_obj) > > File > "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ > <http://www.CIP4.org/JDFSchema_1_1%7DResourcePool_> cannot be > created from: > <pyxb.BIND object at 0x1032a5910> > > > Hrmm......... > > > So, I definitely feel like I'm dancing around the solution, it's in > there somewhere, I just don't really understand enough about how these > bindings are meant to work and I simply can't find a complete example > that describes what I'm trying to do. I'm really hoping that someone > can help me out here and point me in the right direction! > > Thanks so much, > --Kevin > > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > pyxb-users mailing list > pyx...@li... > <mailto:pyx...@li...> > https://lists.sourceforge.net/lists/listinfo/pyxb-users > > |
From: Peter B. <bi...@ac...> - 2015-04-10 23:10:04
|
You've got a pretty complex schema there. Part of the problem is that it allows you a lot of latitude. A JDFProcessNode, via the JDFChildElements_ group, includes an optional ResourcePool element, which in turn is one of the elements of an unbounded sequence. What this means is that a JDF element can have multiple ResourcePool elements inside it. That's why you got two of them in the first attempt: you appended two objects that could be converted (using pyxb.BIND) into ResourcePool elements by synthesizing a ResourcePool element from a value that can be content within a ResourcePool element. It's also why you can't assign a single ResourcePool directly to the JDF.ResourcePool attribute: that attribute requires a plural value (the diagnostic is clearly misleading; the clue is in the exception name). pyxb.BIND can synthesize the right kind of element given parameters that could have been passed to that element's "constructor", but it can't synthesize a list of such elements. If you only want one, start with one, as you did, and append it to the list. Then work with that one. Below is how I might express the code I think you're trying to get: import jdf.JDF as jdf jo = jdf.JDF(ID='job123456', Type='Combined', Status='Waiting') # jo supports multiple ResourcePool elements. Use one, and add it to # the JDF object. rp = jdf.ResourcePool() jo.ResourcePool.append(rp) # Create a Media and add it to the pool mo = jdf.Media(ID='main', Class='Consumable', Status='Available') rp.append(mo) # Then add another rp.append(jdf.Media(ID='perf', Class='Consumable', Status='Available')) print jo.toDOM().toprettyxml() Or: jo = jdf.JDF(ID='job123456', Type='Combined', Status='Waiting') rp = jdf.ResourcePool(jdf.Media(ID='main', Class='Consumable', Status='Available'), jdf.Media(ID='perf', Class='Consumable', Status='Available')) jo.ResourcePool.append(rp) Both give you the same XML: llc[134]$ python test.py <?xml version="1.0" ?> <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" xmlns:ns1=" http://www.CIP4.org/JDFSchema_1_1"> <ns1:ResourcePool> <ns1:Media Class="Consumable" ID="main" Status="Available"/> <ns1:Media Class="Consumable" ID="perf" Status="Available"/> </ns1:ResourcePool> </ns1:JDF> On Fri, Apr 10, 2015 at 2:55 PM, Kevin Murphy <pk...@gm...> wrote: > Hello, > > I've been checking out PyXB (1.2.4) for a project I'm working on > involving the JDF XML schema > (http://www.cip4.org/Schema/JDFSchema_1_4a/JDF.xsd) and in general I > think PyXB will be a great help, but I'm stumbling over an understanding > of how to work with ComplexTypes within the PyXB construct. > > Here's a simplified example of something I'm trying to do: > > So I'm attempting to construct a basic JDF document, and I got about as > far as trying to build something that looks like this: > > <?xml version='1.0' encoding='UTF-8'?> > <JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns="http://www.CIP4.org/JDFSchema_1_1"> > <ResourcePool> > <Media Class="Consumable" ID="main" Status="Available"/> > <Media Class="Consumable" ID="perf" Status="Available"/> > ... > </ResourcePool> > </JDF> > > using code like this: > > import pyxb > > from print_services.jdf.schema import jdf > > jdf_obj = jdf.JDF() > > jdf_obj.ID = "job123456" > jdf_obj.Type = "Combined" > jdf_obj.Status = "Waiting" > > media_obj = jdf.Media() > media_obj.ID = "main" > media_obj.Class = "Consumable" > media_obj.Status = "Available" > > media_obj2 = jdf.Media() > media_obj2.ID = "perf" > media_obj2.Class = "Consumable" > media_obj2.Status = "Available" > > jdf_obj.ResourcePool.append(media_obj) > jdf_obj.ResourcePool.append(media_obj2) > > Which yields: > > File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 425, in _CompatibleValue > raise pyxb.SimpleTypeValueError(cls, value) > pyxb.exceptions_.SimpleTypeValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from > {http://www.CIP4.org/JDFSchema_1_1}Media_r: > <print_services.jdf.schema.jdf.Media_r object at 0x109a360d0> > > So then I thought... ok, maybe I need to create that ResourcePool object: > > jdf_obj.ResourcePool = jdf.ResourcePool() > > Nope: > > File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_: > <print_services.jdf.schema.jdf.ResourcePool_ object at 0x1073436d0> > > Ok, then I went back to the documentation again and started looking into > this pyxb.BIND() thing... > > jdf_obj.ResourcePool.append(pyxb.BIND(media_obj)) > > Hey, that worked! > > <?xml version="1.0" ?> > <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > </ns1:ResourcePool> > </ns1:JDF> > > Ok, so let's add a second Media element: > > jdf_obj.ResourcePool.append(pyxb.BIND(media_obj2)) > > No errors, but ... wait, what? > > <?xml version="1.0" ?> > <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" > xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > </ns1:ResourcePool> > <ns1:ResourcePool> > <ns1:Media Class="Consumable" ID="perf" Status="Available"/> > </ns1:ResourcePool> > </ns1:JDF> > > How did I wind up with two ResourcePool elements? > > Hrmm, ok, maybe I need to construct the ResourcePool element first, and > then assign it into the JDF element? > > rp_obj = jdf.ResourcePool() > rp_obj.append(media_obj) > rp_obj.append(media_obj2) > > print rp_obj.toxml() > > <?xml version="1.0" ?> > <ns1:ResourcePool xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> > <ns1:Media Class="Consumable" ID="main" Status="Available"/> > <ns1:Media Class="Consumable" ID="perf" Status="Available"/> > </ns1:ResourcePool> > > Looking promising now! > > jdf_obj.ResourcePool = rp_obj > > File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_: > <print_services.jdf.schema.jdf.ResourcePool_ object at 0x10453d6d0> > > Shoot. Maybe I need to do that BIND thing? > > jdf_obj.ResourcePool = pyxb.BIND(rp_obj) > > File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", > line 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type > {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from: > <pyxb.BIND object at 0x1032a5910> > > > Hrmm......... > > > So, I definitely feel like I'm dancing around the solution, it's in > there somewhere, I just don't really understand enough about how these > bindings are meant to work and I simply can't find a complete example > that describes what I'm trying to do. I'm really hoping that someone > can help me out here and point me in the right direction! > > Thanks so much, > --Kevin > > > > > ------------------------------------------------------------------------------ > BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT > Develop your own process in accordance with the BPMN 2 standard > Learn Process modeling best practices with Bonita BPM through live > exercises > http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- > event?utm_ > source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF > _______________________________________________ > pyxb-users mailing list > pyx...@li... > https://lists.sourceforge.net/lists/listinfo/pyxb-users > |
From: Kevin M. <pk...@gm...> - 2015-04-10 20:23:15
|
Hello, I've been checking out PyXB (1.2.4) for a project I'm working on involving the JDF XML schema (http://www.cip4.org/Schema/JDFSchema_1_4a/JDF.xsd) and in general I think PyXB will be a great help, but I'm stumbling over an understanding of how to work with ComplexTypes within the PyXB construct. Here's a simplified example of something I'm trying to do: So I'm attempting to construct a basic JDF document, and I got about as far as trying to build something that looks like this: <?xml version='1.0' encoding='UTF-8'?> <JDF ID="job123456" Status="Waiting" Type="Combined" xmlns="http://www.CIP4.org/JDFSchema_1_1"> <ResourcePool> <Media Class="Consumable" ID="main" Status="Available"/> <Media Class="Consumable" ID="perf" Status="Available"/> ... </ResourcePool> </JDF> using code like this: import pyxb from print_services.jdf.schema import jdf jdf_obj = jdf.JDF() jdf_obj.ID = "job123456" jdf_obj.Type = "Combined" jdf_obj.Status = "Waiting" media_obj = jdf.Media() media_obj.ID = "main" media_obj.Class = "Consumable" media_obj.Status = "Available" media_obj2 = jdf.Media() media_obj2.ID = "perf" media_obj2.Class = "Consumable" media_obj2.Status = "Available" jdf_obj.ResourcePool.append(media_obj) jdf_obj.ResourcePool.append(media_obj2) Which yields: File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", line 425, in _CompatibleValue raise pyxb.SimpleTypeValueError(cls, value) pyxb.exceptions_.SimpleTypeValueError: Type {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from {http://www.CIP4.org/JDFSchema_1_1}Media_r: <print_services.jdf.schema.jdf.Media_r object at 0x109a360d0> So then I thought... ok, maybe I need to create that ResourcePool object: jdf_obj.ResourcePool = jdf.ResourcePool() Nope: File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", line 1618, in compatibleValue raise pyxb.SimplePluralValueError(self.typeDefinition(), value) pyxb.exceptions_.SimplePluralValueError: Type {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_: <print_services.jdf.schema.jdf.ResourcePool_ object at 0x1073436d0> Ok, then I went back to the documentation again and started looking into this pyxb.BIND() thing... jdf_obj.ResourcePool.append(pyxb.BIND(media_obj)) Hey, that worked! <?xml version="1.0" ?> <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> <ns1:ResourcePool> <ns1:Media Class="Consumable" ID="main" Status="Available"/> </ns1:ResourcePool> </ns1:JDF> Ok, so let's add a second Media element: jdf_obj.ResourcePool.append(pyxb.BIND(media_obj2)) No errors, but ... wait, what? <?xml version="1.0" ?> <ns1:JDF ID="job123456" Status="Waiting" Type="Combined" xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> <ns1:ResourcePool> <ns1:Media Class="Consumable" ID="main" Status="Available"/> </ns1:ResourcePool> <ns1:ResourcePool> <ns1:Media Class="Consumable" ID="perf" Status="Available"/> </ns1:ResourcePool> </ns1:JDF> How did I wind up with two ResourcePool elements? Hrmm, ok, maybe I need to construct the ResourcePool element first, and then assign it into the JDF element? rp_obj = jdf.ResourcePool() rp_obj.append(media_obj) rp_obj.append(media_obj2) print rp_obj.toxml() <?xml version="1.0" ?> <ns1:ResourcePool xmlns:ns1="http://www.CIP4.org/JDFSchema_1_1"> <ns1:Media Class="Consumable" ID="main" Status="Available"/> <ns1:Media Class="Consumable" ID="perf" Status="Available"/> </ns1:ResourcePool> Looking promising now! jdf_obj.ResourcePool = rp_obj File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", line 1618, in compatibleValue raise pyxb.SimplePluralValueError(self.typeDefinition(), value) pyxb.exceptions_.SimplePluralValueError: Type {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_: <print_services.jdf.schema.jdf.ResourcePool_ object at 0x10453d6d0> Shoot. Maybe I need to do that BIND thing? jdf_obj.ResourcePool = pyxb.BIND(rp_obj) File "/usr/local/lib/python2.7/site-packages/pyxb/binding/basis.py", line 1618, in compatibleValue raise pyxb.SimplePluralValueError(self.typeDefinition(), value) pyxb.exceptions_.SimplePluralValueError: Type {http://www.CIP4.org/JDFSchema_1_1}ResourcePool_ cannot be created from: <pyxb.BIND object at 0x1032a5910> Hrmm......... So, I definitely feel like I'm dancing around the solution, it's in there somewhere, I just don't really understand enough about how these bindings are meant to work and I simply can't find a complete example that describes what I'm trying to do. I'm really hoping that someone can help me out here and point me in the right direction! Thanks so much, --Kevin |
From: Peter B. <bi...@ac...> - 2015-04-03 21:16:30
|
I think you're pretty far off track here, but can't really solve the problem for you. Keep breaking it down to smaller pieces, changing the examples at http://pyxb.sourceforge.net/userref_usebind.html#creating-instances-in-python-code step-by-step towards what you're doing here until you understand what's going on and where it's going wrong. Peter On Fri, Apr 3, 2015 at 3:23 PM, Ajinkya Fotedar <aji...@gm...> wrote: > Ok. Using pyxb.BIND() that way makes sense. However, i followed your > second suggestion for defining complexTypes at the top and then referencing > them and it was working until the point i wanted to lump them all together > into an xml. > > *snippet:* > import organization > import pyxb > > pyxb.RequireValidWhenGenerating(False) > > org = organization.Organization() > empl = organization.EmployeeType() > addr = organization.AddressType() > org.Name = 'company1' > empl.Name = 'name1' > addr.Street = 'address1' > addr.Town = 'town1' > addr.County = 'county1' > addr.PostCode = '54545' > addr.Country = 'US' > > print (org.toxml('utf-8', element_name='Organization')) > > > *error:* > Traceback (most recent call last): > File "testorganization.py", line 24, in <module> > print (org.toxml('utf-8', element_name='Organization')) > File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line > 541, in toxml > dom = self.toDOM(bds, element_name=element_name) > File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line > 513, in toDOM > self._toDOM_csc(bds, element) > File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line > 2661, in _toDOM_csc > content.elementDeclaration.toDOM(dom_support, parent, content.value) > File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line > 1106, in toDOM > raise pyxb.LogicError('toDOM with unrecognized value type %s: %s' % > (type(value), value)) > pyxb.exceptions_.LogicError: toDOM with unrecognized value type <class > 'pyxb.binding.content._PluralBinding'>: [] > > > I do see the objects for complexTypes getting created if i just use "print > org or print empl or print addr", but get the above error when converting > it to xml. > Tried using append, but couldn't really get it to work. > > > On Fri, Apr 3, 2015 at 3:10 PM, Peter Bigot <bi...@ac...> wrote: > >> The new Employee attribute is a sequence. You should append to it or >> assign a sequence to it, not assign a single value. >> >> org.Employee.append(pyxb.BIND()) >> org.Employee = [ pyxb.BIND() ] >> >> If you control the schema, which it seems you do, you'll also find it a >> lot easier to normalize it: define an Employee element at the top level >> just as you do for Organization, and reference that within your complex >> types instead of defining the elements internal to the types. Then you can >> create instances without having to use pyxb.BIND. >> >> Peter >> >> On Fri, Apr 3, 2015 at 1:51 PM, Ajinkya Fotedar <aji...@gm... >> > wrote: >> >>> Thank you Peter for the prompt reply. Made changes to the schema, but >>> now i get the following error on using pyxb.BIND() >>> >>> *Schema:* >>> <xs:schema elementFormDefault="qualified" xmlns:xs=" >>> http://www.w3.org/2001/XMLSchema"> >>> >>> <xs:element name="Organization" type="OrganizationType"/> >>> >>> <xs:complexType name="OrganizationType"> >>> <xs:sequence> >>> <xs:element name="Name" type="xs:string"/> >>> <xs:element name="Employee" type="EmployeeType" >>> minOccurs="1" maxOccurs="unbounded"/> >>> </xs:sequence> >>> </xs:complexType> >>> >>> <xs:complexType name="EmployeeType"> >>> <xs:sequence> >>> <xs:element name="Name" type="xs:string"/> >>> <xs:element name="Address" type="AddressType" minOccurs="1" >>> maxOccurs="unbounded"/> >>> </xs:sequence> >>> </xs:complexType> >>> >>> <xs:complexType name="AddressType"> >>> <xs:sequence> >>> <xs:element name="Street" type="xs:string"/> >>> <xs:element name="Town" type="xs:string"/> >>> <xs:element name="County" type="xs:string"/> >>> <xs:element name="PostCode" type="xs:integer”/> >>> <xs:element name="Country" type="xs:string"/> >>> </xs:sequence> >>> </xs:complexType> >>> >>> </xs:schema> >>> >>> >>> *Creating XML:* >>> import organization >>> import pyxb >>> >>> pyxb.RequireValidWhenGenerating(False) >>> >>> org = organization.Organization() >>> org.Name = 'company1' >>> org.Employee = pyxb.BIND() >>> print org.toxml() >>> >>> >>> *Error:* >>> Traceback (most recent call last): >>> File "testorganization.py", line 12, in <module> >>> org.Employee = pyxb.BIND() >>> File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line >>> 98, in __setattr__ >>> return super(_TypeBinding_mixin, self).__setattr__(name, value) >>> File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line >>> 1043, in set >>> value = self.__elementBinding.compatibleValue(value, >>> is_plural=self.isPlural()) >>> File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line >>> 1618, in compatibleValue >>> raise pyxb.SimplePluralValueError(self.typeDefinition(), value) >>> pyxb.exceptions_.SimplePluralValueError: Type EmployeeType cannot be >>> created from: <pyxb.BIND object at 0x10fd8ec50> >>> >>> >>> Following pyxb's documentation, BIND was woking before i made the >>> change, for dealing with complexTypes, or am i missing something >>> fundamental here. >>> >>> Thank you. >>> >>> >>> On Fri, Apr 3, 2015 at 10:50 AM, Peter Bigot <bi...@ac...> wrote: >>> >>>> This isn't a PyXB issue. Your schema extract only allows for a single >>>> Employee element with a single Address element. You're going to need to >>>> use maxOccurs="unbounded" or some similar directive in the schema >>>> definition. >>>> >>>> Peter >>>> >>>> On Fri, Apr 3, 2015 at 9:14 AM, Ajinkya Fotedar < >>>> aji...@gm...> wrote: >>>> >>>>> I'd like to have multiple instances of complexTypes in an XML created >>>>> from the bindings. Not sure if/how this can be done using BIND and/or >>>>> append. >>>>> Will try and explain with an example i'm playing with. >>>>> >>>>> *XML Schema…* >>>>> <xs:schema elementFormDefault="qualified" xmlns:xs=" >>>>> http://www.w3.org/2001/XMLSchema"> >>>>> >>>>> <xs:element name="Organization" type="OrganizationType"/> >>>>> >>>>> <xs:complexType name="OrganizationType"> >>>>> <xs:sequence> >>>>> <xs:element name="Name" type="xs:string"/> >>>>> <xs:element name="Employee" type="EmployeeType"/> >>>>> </xs:sequence> >>>>> </xs:complexType> >>>>> >>>>> <xs:complexType name="EmployeeType"> >>>>> <xs:sequence> >>>>> <xs:element name="Name" type="xs:string"/> >>>>> <xs:element name="Address" type="AddressType"/> >>>>> </xs:sequence> >>>>> </xs:complexType> >>>>> >>>>> <xs:complexType name="AddressType"> >>>>> <xs:sequence> >>>>> <xs:element name="Street" type="xs:string"/> >>>>> <xs:element name="Town" type="xs:string"/> >>>>> <xs:element name="County" type="xs:string"/> >>>>> <xs:element name="PostCode" type="xs:integer”/> >>>>> <xs:element name="Country" type="xs:string"/> >>>>> </xs:sequence> >>>>> </xs:complexType> >>>>> >>>>> </xs:schema> >>>>> >>>>> >>>>> *Used the above schema for generating bindings…* >>>>> pyxbgen -u organization.xsd -m organization >>>>> >>>>> >>>>> *Used the ‘organization’ module for generating an xml...* >>>>> import organization >>>>> import pyxb >>>>> >>>>> org = organization.Organization() >>>>> org.Employee = pyxb.BIND() >>>>> org.Employee.Address = pyxb.BIND() >>>>> org.Name = 'company1’ >>>>> org.Employee.Name = 'name1’ >>>>> org.Employee.Address.Street = 'street1’ >>>>> org.Employee.Address.Town = 'town1’ >>>>> org.Employee.Address.County = 'county1’ >>>>> org.Employee.Address.PostCode = 54545 >>>>> org.Employee.Address.Country = 'US' >>>>> print (org.toxml('utf-8', element_name='Organization')) >>>>> >>>>> >>>>> *Output…* >>>>> <Organization> >>>>> <Name>company1</Name> >>>>> <Employee> >>>>> <Name>name1</Name> >>>>> <Address> >>>>> <Street>street1</Street> >>>>> <Town>town1</Town> >>>>> <County>county1</County> >>>>> <PostCode>54545</PostCode> >>>>> <Country>US</Country> >>>>> </Address> >>>>> </Employee> >>>>> </Organization> >>>>> >>>>> >>>>> *What i'd like the o/p to be…* >>>>> <Organization> >>>>> <Name>company1</Name> >>>>> <Employee> >>>>> <Name>name1</Name> >>>>> <Address> >>>>> <Street>street1</Street> >>>>> <Town>town1</Town> >>>>> <County>county1</County> >>>>> <PostCode>54545</PostCode> >>>>> <Country>US</Country> >>>>> </Address> >>>>> <Address> >>>>> <Street>street2</Street> >>>>> <Town>town2</Town> >>>>> <County>county2</County> >>>>> <PostCode>77777</PostCode> >>>>> <Country>US</Country> >>>>> </Address> >>>>> </Employee> >>>>> </Organization> >>>>> >>>>> *OR…* >>>>> <Organization> >>>>> <Name>company1</Name> >>>>> <Employee> >>>>> <Name>name1</Name> >>>>> <Address> >>>>> <Street>street1</Street> >>>>> <Town>town1</Town> >>>>> <County>county1</County> >>>>> <PostCode>54545</PostCode> >>>>> <Country>US</Country> >>>>> </Address> >>>>> </Employee> >>>>> <Employee> >>>>> <Name>name2</Name> >>>>> <Address> >>>>> <Street>street2</Street> >>>>> <Town>town2</Town> >>>>> <County>county2</County> >>>>> <PostCode>45454</PostCode> >>>>> <Country>UK</Country> >>>>> </Address> >>>>> </Employee> >>>>> </Organization> >>>>> >>>>> Would really appreciate if any one here could point me to the right >>>>> direction. I believe BIND and append/extend will do the job. I have tried >>>>> them from this link >>>>> http://sourceforge.net/p/pyxb/discussion/956708/thread/c3da791a/#922f >>>>> but nothing has worked out so far. >>>>> >>>>> Thank you. >>>>> >>>>> >>>>> ------------------------------------------------------------------------------ >>>>> Dive into the World of Parallel Programming The Go Parallel Website, >>>>> sponsored >>>>> by Intel and developed in partnership with Slashdot Media, is your hub >>>>> for all >>>>> things parallel software development, from weekly thought leadership >>>>> blogs to >>>>> news, videos, case studies, tutorials and more. Take a look and join >>>>> the >>>>> conversation now. http://goparallel.sourceforge.net/ >>>>> _______________________________________________ >>>>> pyxb-users mailing list >>>>> pyx...@li... >>>>> https://lists.sourceforge.net/lists/listinfo/pyxb-users >>>>> >>>>> >>>> >>> >> > |
From: Ajinkya F. <aji...@gm...> - 2015-04-03 20:24:00
|
Ok. Using pyxb.BIND() that way makes sense. However, i followed your second suggestion for defining complexTypes at the top and then referencing them and it was working until the point i wanted to lump them all together into an xml. *snippet:* import organization import pyxb pyxb.RequireValidWhenGenerating(False) org = organization.Organization() empl = organization.EmployeeType() addr = organization.AddressType() org.Name = 'company1' empl.Name = 'name1' addr.Street = 'address1' addr.Town = 'town1' addr.County = 'county1' addr.PostCode = '54545' addr.Country = 'US' print (org.toxml('utf-8', element_name='Organization')) *error:* Traceback (most recent call last): File "testorganization.py", line 24, in <module> print (org.toxml('utf-8', element_name='Organization')) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 541, in toxml dom = self.toDOM(bds, element_name=element_name) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 513, in toDOM self._toDOM_csc(bds, element) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 2661, in _toDOM_csc content.elementDeclaration.toDOM(dom_support, parent, content.value) File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line 1106, in toDOM raise pyxb.LogicError('toDOM with unrecognized value type %s: %s' % (type(value), value)) pyxb.exceptions_.LogicError: toDOM with unrecognized value type <class 'pyxb.binding.content._PluralBinding'>: [] I do see the objects for complexTypes getting created if i just use "print org or print empl or print addr", but get the above error when converting it to xml. Tried using append, but couldn't really get it to work. On Fri, Apr 3, 2015 at 3:10 PM, Peter Bigot <bi...@ac...> wrote: > The new Employee attribute is a sequence. You should append to it or > assign a sequence to it, not assign a single value. > > org.Employee.append(pyxb.BIND()) > org.Employee = [ pyxb.BIND() ] > > If you control the schema, which it seems you do, you'll also find it a > lot easier to normalize it: define an Employee element at the top level > just as you do for Organization, and reference that within your complex > types instead of defining the elements internal to the types. Then you can > create instances without having to use pyxb.BIND. > > Peter > > On Fri, Apr 3, 2015 at 1:51 PM, Ajinkya Fotedar <aji...@gm...> > wrote: > >> Thank you Peter for the prompt reply. Made changes to the schema, but now >> i get the following error on using pyxb.BIND() >> >> *Schema:* >> <xs:schema elementFormDefault="qualified" xmlns:xs=" >> http://www.w3.org/2001/XMLSchema"> >> >> <xs:element name="Organization" type="OrganizationType"/> >> >> <xs:complexType name="OrganizationType"> >> <xs:sequence> >> <xs:element name="Name" type="xs:string"/> >> <xs:element name="Employee" type="EmployeeType" minOccurs="1" >> maxOccurs="unbounded"/> >> </xs:sequence> >> </xs:complexType> >> >> <xs:complexType name="EmployeeType"> >> <xs:sequence> >> <xs:element name="Name" type="xs:string"/> >> <xs:element name="Address" type="AddressType" minOccurs="1" >> maxOccurs="unbounded"/> >> </xs:sequence> >> </xs:complexType> >> >> <xs:complexType name="AddressType"> >> <xs:sequence> >> <xs:element name="Street" type="xs:string"/> >> <xs:element name="Town" type="xs:string"/> >> <xs:element name="County" type="xs:string"/> >> <xs:element name="PostCode" type="xs:integer”/> >> <xs:element name="Country" type="xs:string"/> >> </xs:sequence> >> </xs:complexType> >> >> </xs:schema> >> >> >> *Creating XML:* >> import organization >> import pyxb >> >> pyxb.RequireValidWhenGenerating(False) >> >> org = organization.Organization() >> org.Name = 'company1' >> org.Employee = pyxb.BIND() >> print org.toxml() >> >> >> *Error:* >> Traceback (most recent call last): >> File "testorganization.py", line 12, in <module> >> org.Employee = pyxb.BIND() >> File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line >> 98, in __setattr__ >> return super(_TypeBinding_mixin, self).__setattr__(name, value) >> File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line >> 1043, in set >> value = self.__elementBinding.compatibleValue(value, >> is_plural=self.isPlural()) >> File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line >> 1618, in compatibleValue >> raise pyxb.SimplePluralValueError(self.typeDefinition(), value) >> pyxb.exceptions_.SimplePluralValueError: Type EmployeeType cannot be >> created from: <pyxb.BIND object at 0x10fd8ec50> >> >> >> Following pyxb's documentation, BIND was woking before i made the change, >> for dealing with complexTypes, or am i missing something fundamental here. >> >> Thank you. >> >> >> On Fri, Apr 3, 2015 at 10:50 AM, Peter Bigot <bi...@ac...> wrote: >> >>> This isn't a PyXB issue. Your schema extract only allows for a single >>> Employee element with a single Address element. You're going to need to >>> use maxOccurs="unbounded" or some similar directive in the schema >>> definition. >>> >>> Peter >>> >>> On Fri, Apr 3, 2015 at 9:14 AM, Ajinkya Fotedar < >>> aji...@gm...> wrote: >>> >>>> I'd like to have multiple instances of complexTypes in an XML created >>>> from the bindings. Not sure if/how this can be done using BIND and/or >>>> append. >>>> Will try and explain with an example i'm playing with. >>>> >>>> *XML Schema…* >>>> <xs:schema elementFormDefault="qualified" xmlns:xs=" >>>> http://www.w3.org/2001/XMLSchema"> >>>> >>>> <xs:element name="Organization" type="OrganizationType"/> >>>> >>>> <xs:complexType name="OrganizationType"> >>>> <xs:sequence> >>>> <xs:element name="Name" type="xs:string"/> >>>> <xs:element name="Employee" type="EmployeeType"/> >>>> </xs:sequence> >>>> </xs:complexType> >>>> >>>> <xs:complexType name="EmployeeType"> >>>> <xs:sequence> >>>> <xs:element name="Name" type="xs:string"/> >>>> <xs:element name="Address" type="AddressType"/> >>>> </xs:sequence> >>>> </xs:complexType> >>>> >>>> <xs:complexType name="AddressType"> >>>> <xs:sequence> >>>> <xs:element name="Street" type="xs:string"/> >>>> <xs:element name="Town" type="xs:string"/> >>>> <xs:element name="County" type="xs:string"/> >>>> <xs:element name="PostCode" type="xs:integer”/> >>>> <xs:element name="Country" type="xs:string"/> >>>> </xs:sequence> >>>> </xs:complexType> >>>> >>>> </xs:schema> >>>> >>>> >>>> *Used the above schema for generating bindings…* >>>> pyxbgen -u organization.xsd -m organization >>>> >>>> >>>> *Used the ‘organization’ module for generating an xml...* >>>> import organization >>>> import pyxb >>>> >>>> org = organization.Organization() >>>> org.Employee = pyxb.BIND() >>>> org.Employee.Address = pyxb.BIND() >>>> org.Name = 'company1’ >>>> org.Employee.Name = 'name1’ >>>> org.Employee.Address.Street = 'street1’ >>>> org.Employee.Address.Town = 'town1’ >>>> org.Employee.Address.County = 'county1’ >>>> org.Employee.Address.PostCode = 54545 >>>> org.Employee.Address.Country = 'US' >>>> print (org.toxml('utf-8', element_name='Organization')) >>>> >>>> >>>> *Output…* >>>> <Organization> >>>> <Name>company1</Name> >>>> <Employee> >>>> <Name>name1</Name> >>>> <Address> >>>> <Street>street1</Street> >>>> <Town>town1</Town> >>>> <County>county1</County> >>>> <PostCode>54545</PostCode> >>>> <Country>US</Country> >>>> </Address> >>>> </Employee> >>>> </Organization> >>>> >>>> >>>> *What i'd like the o/p to be…* >>>> <Organization> >>>> <Name>company1</Name> >>>> <Employee> >>>> <Name>name1</Name> >>>> <Address> >>>> <Street>street1</Street> >>>> <Town>town1</Town> >>>> <County>county1</County> >>>> <PostCode>54545</PostCode> >>>> <Country>US</Country> >>>> </Address> >>>> <Address> >>>> <Street>street2</Street> >>>> <Town>town2</Town> >>>> <County>county2</County> >>>> <PostCode>77777</PostCode> >>>> <Country>US</Country> >>>> </Address> >>>> </Employee> >>>> </Organization> >>>> >>>> *OR…* >>>> <Organization> >>>> <Name>company1</Name> >>>> <Employee> >>>> <Name>name1</Name> >>>> <Address> >>>> <Street>street1</Street> >>>> <Town>town1</Town> >>>> <County>county1</County> >>>> <PostCode>54545</PostCode> >>>> <Country>US</Country> >>>> </Address> >>>> </Employee> >>>> <Employee> >>>> <Name>name2</Name> >>>> <Address> >>>> <Street>street2</Street> >>>> <Town>town2</Town> >>>> <County>county2</County> >>>> <PostCode>45454</PostCode> >>>> <Country>UK</Country> >>>> </Address> >>>> </Employee> >>>> </Organization> >>>> >>>> Would really appreciate if any one here could point me to the right >>>> direction. I believe BIND and append/extend will do the job. I have tried >>>> them from this link >>>> http://sourceforge.net/p/pyxb/discussion/956708/thread/c3da791a/#922f >>>> but nothing has worked out so far. >>>> >>>> Thank you. >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> Dive into the World of Parallel Programming The Go Parallel Website, >>>> sponsored >>>> by Intel and developed in partnership with Slashdot Media, is your hub >>>> for all >>>> things parallel software development, from weekly thought leadership >>>> blogs to >>>> news, videos, case studies, tutorials and more. Take a look and join the >>>> conversation now. http://goparallel.sourceforge.net/ >>>> _______________________________________________ >>>> pyxb-users mailing list >>>> pyx...@li... >>>> https://lists.sourceforge.net/lists/listinfo/pyxb-users >>>> >>>> >>> >> > |
From: Peter B. <bi...@ac...> - 2015-04-03 19:10:18
|
The new Employee attribute is a sequence. You should append to it or assign a sequence to it, not assign a single value. org.Employee.append(pyxb.BIND()) org.Employee = [ pyxb.BIND() ] If you control the schema, which it seems you do, you'll also find it a lot easier to normalize it: define an Employee element at the top level just as you do for Organization, and reference that within your complex types instead of defining the elements internal to the types. Then you can create instances without having to use pyxb.BIND. Peter On Fri, Apr 3, 2015 at 1:51 PM, Ajinkya Fotedar <aji...@gm...> wrote: > Thank you Peter for the prompt reply. Made changes to the schema, but now > i get the following error on using pyxb.BIND() > > *Schema:* > <xs:schema elementFormDefault="qualified" xmlns:xs=" > http://www.w3.org/2001/XMLSchema"> > > <xs:element name="Organization" type="OrganizationType"/> > > <xs:complexType name="OrganizationType"> > <xs:sequence> > <xs:element name="Name" type="xs:string"/> > <xs:element name="Employee" type="EmployeeType" minOccurs="1" > maxOccurs="unbounded"/> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="EmployeeType"> > <xs:sequence> > <xs:element name="Name" type="xs:string"/> > <xs:element name="Address" type="AddressType" minOccurs="1" > maxOccurs="unbounded"/> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="AddressType"> > <xs:sequence> > <xs:element name="Street" type="xs:string"/> > <xs:element name="Town" type="xs:string"/> > <xs:element name="County" type="xs:string"/> > <xs:element name="PostCode" type="xs:integer”/> > <xs:element name="Country" type="xs:string"/> > </xs:sequence> > </xs:complexType> > > </xs:schema> > > > *Creating XML:* > import organization > import pyxb > > pyxb.RequireValidWhenGenerating(False) > > org = organization.Organization() > org.Name = 'company1' > org.Employee = pyxb.BIND() > print org.toxml() > > > *Error:* > Traceback (most recent call last): > File "testorganization.py", line 12, in <module> > org.Employee = pyxb.BIND() > File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 98, > in __setattr__ > return super(_TypeBinding_mixin, self).__setattr__(name, value) > File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line > 1043, in set > value = self.__elementBinding.compatibleValue(value, > is_plural=self.isPlural()) > File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line > 1618, in compatibleValue > raise pyxb.SimplePluralValueError(self.typeDefinition(), value) > pyxb.exceptions_.SimplePluralValueError: Type EmployeeType cannot be > created from: <pyxb.BIND object at 0x10fd8ec50> > > > Following pyxb's documentation, BIND was woking before i made the change, > for dealing with complexTypes, or am i missing something fundamental here. > > Thank you. > > > On Fri, Apr 3, 2015 at 10:50 AM, Peter Bigot <bi...@ac...> wrote: > >> This isn't a PyXB issue. Your schema extract only allows for a single >> Employee element with a single Address element. You're going to need to >> use maxOccurs="unbounded" or some similar directive in the schema >> definition. >> >> Peter >> >> On Fri, Apr 3, 2015 at 9:14 AM, Ajinkya Fotedar <aji...@gm... >> > wrote: >> >>> I'd like to have multiple instances of complexTypes in an XML created >>> from the bindings. Not sure if/how this can be done using BIND and/or >>> append. >>> Will try and explain with an example i'm playing with. >>> >>> *XML Schema…* >>> <xs:schema elementFormDefault="qualified" xmlns:xs=" >>> http://www.w3.org/2001/XMLSchema"> >>> >>> <xs:element name="Organization" type="OrganizationType"/> >>> >>> <xs:complexType name="OrganizationType"> >>> <xs:sequence> >>> <xs:element name="Name" type="xs:string"/> >>> <xs:element name="Employee" type="EmployeeType"/> >>> </xs:sequence> >>> </xs:complexType> >>> >>> <xs:complexType name="EmployeeType"> >>> <xs:sequence> >>> <xs:element name="Name" type="xs:string"/> >>> <xs:element name="Address" type="AddressType"/> >>> </xs:sequence> >>> </xs:complexType> >>> >>> <xs:complexType name="AddressType"> >>> <xs:sequence> >>> <xs:element name="Street" type="xs:string"/> >>> <xs:element name="Town" type="xs:string"/> >>> <xs:element name="County" type="xs:string"/> >>> <xs:element name="PostCode" type="xs:integer”/> >>> <xs:element name="Country" type="xs:string"/> >>> </xs:sequence> >>> </xs:complexType> >>> >>> </xs:schema> >>> >>> >>> *Used the above schema for generating bindings…* >>> pyxbgen -u organization.xsd -m organization >>> >>> >>> *Used the ‘organization’ module for generating an xml...* >>> import organization >>> import pyxb >>> >>> org = organization.Organization() >>> org.Employee = pyxb.BIND() >>> org.Employee.Address = pyxb.BIND() >>> org.Name = 'company1’ >>> org.Employee.Name = 'name1’ >>> org.Employee.Address.Street = 'street1’ >>> org.Employee.Address.Town = 'town1’ >>> org.Employee.Address.County = 'county1’ >>> org.Employee.Address.PostCode = 54545 >>> org.Employee.Address.Country = 'US' >>> print (org.toxml('utf-8', element_name='Organization')) >>> >>> >>> *Output…* >>> <Organization> >>> <Name>company1</Name> >>> <Employee> >>> <Name>name1</Name> >>> <Address> >>> <Street>street1</Street> >>> <Town>town1</Town> >>> <County>county1</County> >>> <PostCode>54545</PostCode> >>> <Country>US</Country> >>> </Address> >>> </Employee> >>> </Organization> >>> >>> >>> *What i'd like the o/p to be…* >>> <Organization> >>> <Name>company1</Name> >>> <Employee> >>> <Name>name1</Name> >>> <Address> >>> <Street>street1</Street> >>> <Town>town1</Town> >>> <County>county1</County> >>> <PostCode>54545</PostCode> >>> <Country>US</Country> >>> </Address> >>> <Address> >>> <Street>street2</Street> >>> <Town>town2</Town> >>> <County>county2</County> >>> <PostCode>77777</PostCode> >>> <Country>US</Country> >>> </Address> >>> </Employee> >>> </Organization> >>> >>> *OR…* >>> <Organization> >>> <Name>company1</Name> >>> <Employee> >>> <Name>name1</Name> >>> <Address> >>> <Street>street1</Street> >>> <Town>town1</Town> >>> <County>county1</County> >>> <PostCode>54545</PostCode> >>> <Country>US</Country> >>> </Address> >>> </Employee> >>> <Employee> >>> <Name>name2</Name> >>> <Address> >>> <Street>street2</Street> >>> <Town>town2</Town> >>> <County>county2</County> >>> <PostCode>45454</PostCode> >>> <Country>UK</Country> >>> </Address> >>> </Employee> >>> </Organization> >>> >>> Would really appreciate if any one here could point me to the right >>> direction. I believe BIND and append/extend will do the job. I have tried >>> them from this link >>> http://sourceforge.net/p/pyxb/discussion/956708/thread/c3da791a/#922f >>> but nothing has worked out so far. >>> >>> Thank you. >>> >>> >>> ------------------------------------------------------------------------------ >>> Dive into the World of Parallel Programming The Go Parallel Website, >>> sponsored >>> by Intel and developed in partnership with Slashdot Media, is your hub >>> for all >>> things parallel software development, from weekly thought leadership >>> blogs to >>> news, videos, case studies, tutorials and more. Take a look and join the >>> conversation now. http://goparallel.sourceforge.net/ >>> _______________________________________________ >>> pyxb-users mailing list >>> pyx...@li... >>> https://lists.sourceforge.net/lists/listinfo/pyxb-users >>> >>> >> > |
From: Ajinkya F. <aji...@gm...> - 2015-04-03 18:51:31
|
Thank you Peter for the prompt reply. Made changes to the schema, but now i get the following error on using pyxb.BIND() *Schema:* <xs:schema elementFormDefault="qualified" xmlns:xs=" http://www.w3.org/2001/XMLSchema"> <xs:element name="Organization" type="OrganizationType"/> <xs:complexType name="OrganizationType"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Employee" type="EmployeeType" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="EmployeeType"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Address" type="AddressType" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="AddressType"> <xs:sequence> <xs:element name="Street" type="xs:string"/> <xs:element name="Town" type="xs:string"/> <xs:element name="County" type="xs:string"/> <xs:element name="PostCode" type="xs:integer”/> <xs:element name="Country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> *Creating XML:* import organization import pyxb pyxb.RequireValidWhenGenerating(False) org = organization.Organization() org.Name = 'company1' org.Employee = pyxb.BIND() print org.toxml() *Error:* Traceback (most recent call last): File "testorganization.py", line 12, in <module> org.Employee = pyxb.BIND() File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 98, in __setattr__ return super(_TypeBinding_mixin, self).__setattr__(name, value) File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line 1043, in set value = self.__elementBinding.compatibleValue(value, is_plural=self.isPlural()) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 1618, in compatibleValue raise pyxb.SimplePluralValueError(self.typeDefinition(), value) pyxb.exceptions_.SimplePluralValueError: Type EmployeeType cannot be created from: <pyxb.BIND object at 0x10fd8ec50> Following pyxb's documentation, BIND was woking before i made the change, for dealing with complexTypes, or am i missing something fundamental here. Thank you. On Fri, Apr 3, 2015 at 10:50 AM, Peter Bigot <bi...@ac...> wrote: > This isn't a PyXB issue. Your schema extract only allows for a single > Employee element with a single Address element. You're going to need to > use maxOccurs="unbounded" or some similar directive in the schema > definition. > > Peter > > On Fri, Apr 3, 2015 at 9:14 AM, Ajinkya Fotedar <aji...@gm...> > wrote: > >> I'd like to have multiple instances of complexTypes in an XML created >> from the bindings. Not sure if/how this can be done using BIND and/or >> append. >> Will try and explain with an example i'm playing with. >> >> *XML Schema…* >> <xs:schema elementFormDefault="qualified" xmlns:xs=" >> http://www.w3.org/2001/XMLSchema"> >> >> <xs:element name="Organization" type="OrganizationType"/> >> >> <xs:complexType name="OrganizationType"> >> <xs:sequence> >> <xs:element name="Name" type="xs:string"/> >> <xs:element name="Employee" type="EmployeeType"/> >> </xs:sequence> >> </xs:complexType> >> >> <xs:complexType name="EmployeeType"> >> <xs:sequence> >> <xs:element name="Name" type="xs:string"/> >> <xs:element name="Address" type="AddressType"/> >> </xs:sequence> >> </xs:complexType> >> >> <xs:complexType name="AddressType"> >> <xs:sequence> >> <xs:element name="Street" type="xs:string"/> >> <xs:element name="Town" type="xs:string"/> >> <xs:element name="County" type="xs:string"/> >> <xs:element name="PostCode" type="xs:integer”/> >> <xs:element name="Country" type="xs:string"/> >> </xs:sequence> >> </xs:complexType> >> >> </xs:schema> >> >> >> *Used the above schema for generating bindings…* >> pyxbgen -u organization.xsd -m organization >> >> >> *Used the ‘organization’ module for generating an xml...* >> import organization >> import pyxb >> >> org = organization.Organization() >> org.Employee = pyxb.BIND() >> org.Employee.Address = pyxb.BIND() >> org.Name = 'company1’ >> org.Employee.Name = 'name1’ >> org.Employee.Address.Street = 'street1’ >> org.Employee.Address.Town = 'town1’ >> org.Employee.Address.County = 'county1’ >> org.Employee.Address.PostCode = 54545 >> org.Employee.Address.Country = 'US' >> print (org.toxml('utf-8', element_name='Organization')) >> >> >> *Output…* >> <Organization> >> <Name>company1</Name> >> <Employee> >> <Name>name1</Name> >> <Address> >> <Street>street1</Street> >> <Town>town1</Town> >> <County>county1</County> >> <PostCode>54545</PostCode> >> <Country>US</Country> >> </Address> >> </Employee> >> </Organization> >> >> >> *What i'd like the o/p to be…* >> <Organization> >> <Name>company1</Name> >> <Employee> >> <Name>name1</Name> >> <Address> >> <Street>street1</Street> >> <Town>town1</Town> >> <County>county1</County> >> <PostCode>54545</PostCode> >> <Country>US</Country> >> </Address> >> <Address> >> <Street>street2</Street> >> <Town>town2</Town> >> <County>county2</County> >> <PostCode>77777</PostCode> >> <Country>US</Country> >> </Address> >> </Employee> >> </Organization> >> >> *OR…* >> <Organization> >> <Name>company1</Name> >> <Employee> >> <Name>name1</Name> >> <Address> >> <Street>street1</Street> >> <Town>town1</Town> >> <County>county1</County> >> <PostCode>54545</PostCode> >> <Country>US</Country> >> </Address> >> </Employee> >> <Employee> >> <Name>name2</Name> >> <Address> >> <Street>street2</Street> >> <Town>town2</Town> >> <County>county2</County> >> <PostCode>45454</PostCode> >> <Country>UK</Country> >> </Address> >> </Employee> >> </Organization> >> >> Would really appreciate if any one here could point me to the right >> direction. I believe BIND and append/extend will do the job. I have tried >> them from this link >> http://sourceforge.net/p/pyxb/discussion/956708/thread/c3da791a/#922f >> but nothing has worked out so far. >> >> Thank you. >> >> >> ------------------------------------------------------------------------------ >> Dive into the World of Parallel Programming The Go Parallel Website, >> sponsored >> by Intel and developed in partnership with Slashdot Media, is your hub >> for all >> things parallel software development, from weekly thought leadership >> blogs to >> news, videos, case studies, tutorials and more. Take a look and join the >> conversation now. http://goparallel.sourceforge.net/ >> _______________________________________________ >> pyxb-users mailing list >> pyx...@li... >> https://lists.sourceforge.net/lists/listinfo/pyxb-users >> >> > |
From: Peter B. <bi...@ac...> - 2015-04-03 14:50:36
|
This isn't a PyXB issue. Your schema extract only allows for a single Employee element with a single Address element. You're going to need to use maxOccurs="unbounded" or some similar directive in the schema definition. Peter On Fri, Apr 3, 2015 at 9:14 AM, Ajinkya Fotedar <aji...@gm...> wrote: > I'd like to have multiple instances of complexTypes in an XML created from > the bindings. Not sure if/how this can be done using BIND and/or append. > Will try and explain with an example i'm playing with. > > *XML Schema…* > <xs:schema elementFormDefault="qualified" xmlns:xs=" > http://www.w3.org/2001/XMLSchema"> > > <xs:element name="Organization" type="OrganizationType"/> > > <xs:complexType name="OrganizationType"> > <xs:sequence> > <xs:element name="Name" type="xs:string"/> > <xs:element name="Employee" type="EmployeeType"/> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="EmployeeType"> > <xs:sequence> > <xs:element name="Name" type="xs:string"/> > <xs:element name="Address" type="AddressType"/> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="AddressType"> > <xs:sequence> > <xs:element name="Street" type="xs:string"/> > <xs:element name="Town" type="xs:string"/> > <xs:element name="County" type="xs:string"/> > <xs:element name="PostCode" type="xs:integer”/> > <xs:element name="Country" type="xs:string"/> > </xs:sequence> > </xs:complexType> > > </xs:schema> > > > *Used the above schema for generating bindings…* > pyxbgen -u organization.xsd -m organization > > > *Used the ‘organization’ module for generating an xml...* > import organization > import pyxb > > org = organization.Organization() > org.Employee = pyxb.BIND() > org.Employee.Address = pyxb.BIND() > org.Name = 'company1’ > org.Employee.Name = 'name1’ > org.Employee.Address.Street = 'street1’ > org.Employee.Address.Town = 'town1’ > org.Employee.Address.County = 'county1’ > org.Employee.Address.PostCode = 54545 > org.Employee.Address.Country = 'US' > print (org.toxml('utf-8', element_name='Organization')) > > > *Output…* > <Organization> > <Name>company1</Name> > <Employee> > <Name>name1</Name> > <Address> > <Street>street1</Street> > <Town>town1</Town> > <County>county1</County> > <PostCode>54545</PostCode> > <Country>US</Country> > </Address> > </Employee> > </Organization> > > > *What i'd like the o/p to be…* > <Organization> > <Name>company1</Name> > <Employee> > <Name>name1</Name> > <Address> > <Street>street1</Street> > <Town>town1</Town> > <County>county1</County> > <PostCode>54545</PostCode> > <Country>US</Country> > </Address> > <Address> > <Street>street2</Street> > <Town>town2</Town> > <County>county2</County> > <PostCode>77777</PostCode> > <Country>US</Country> > </Address> > </Employee> > </Organization> > > *OR…* > <Organization> > <Name>company1</Name> > <Employee> > <Name>name1</Name> > <Address> > <Street>street1</Street> > <Town>town1</Town> > <County>county1</County> > <PostCode>54545</PostCode> > <Country>US</Country> > </Address> > </Employee> > <Employee> > <Name>name2</Name> > <Address> > <Street>street2</Street> > <Town>town2</Town> > <County>county2</County> > <PostCode>45454</PostCode> > <Country>UK</Country> > </Address> > </Employee> > </Organization> > > Would really appreciate if any one here could point me to the right > direction. I believe BIND and append/extend will do the job. I have tried > them from this link > http://sourceforge.net/p/pyxb/discussion/956708/thread/c3da791a/#922f but > nothing has worked out so far. > > Thank you. > > > ------------------------------------------------------------------------------ > Dive into the World of Parallel Programming The Go Parallel Website, > sponsored > by Intel and developed in partnership with Slashdot Media, is your hub for > all > things parallel software development, from weekly thought leadership blogs > to > news, videos, case studies, tutorials and more. Take a look and join the > conversation now. http://goparallel.sourceforge.net/ > _______________________________________________ > pyxb-users mailing list > pyx...@li... > https://lists.sourceforge.net/lists/listinfo/pyxb-users > > |
From: Ajinkya F. <aji...@gm...> - 2015-04-03 14:14:12
|
I'd like to have multiple instances of complexTypes in an XML created from the bindings. Not sure if/how this can be done using BIND and/or append. Will try and explain with an example i'm playing with. *XML Schema…* <xs:schema elementFormDefault="qualified" xmlns:xs=" http://www.w3.org/2001/XMLSchema"> <xs:element name="Organization" type="OrganizationType"/> <xs:complexType name="OrganizationType"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Employee" type="EmployeeType"/> </xs:sequence> </xs:complexType> <xs:complexType name="EmployeeType"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Address" type="AddressType"/> </xs:sequence> </xs:complexType> <xs:complexType name="AddressType"> <xs:sequence> <xs:element name="Street" type="xs:string"/> <xs:element name="Town" type="xs:string"/> <xs:element name="County" type="xs:string"/> <xs:element name="PostCode" type="xs:integer”/> <xs:element name="Country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> *Used the above schema for generating bindings…* pyxbgen -u organization.xsd -m organization *Used the ‘organization’ module for generating an xml...* import organization import pyxb org = organization.Organization() org.Employee = pyxb.BIND() org.Employee.Address = pyxb.BIND() org.Name = 'company1’ org.Employee.Name = 'name1’ org.Employee.Address.Street = 'street1’ org.Employee.Address.Town = 'town1’ org.Employee.Address.County = 'county1’ org.Employee.Address.PostCode = 54545 org.Employee.Address.Country = 'US' print (org.toxml('utf-8', element_name='Organization')) *Output…* <Organization> <Name>company1</Name> <Employee> <Name>name1</Name> <Address> <Street>street1</Street> <Town>town1</Town> <County>county1</County> <PostCode>54545</PostCode> <Country>US</Country> </Address> </Employee> </Organization> *What i'd like the o/p to be…* <Organization> <Name>company1</Name> <Employee> <Name>name1</Name> <Address> <Street>street1</Street> <Town>town1</Town> <County>county1</County> <PostCode>54545</PostCode> <Country>US</Country> </Address> <Address> <Street>street2</Street> <Town>town2</Town> <County>county2</County> <PostCode>77777</PostCode> <Country>US</Country> </Address> </Employee> </Organization> *OR…* <Organization> <Name>company1</Name> <Employee> <Name>name1</Name> <Address> <Street>street1</Street> <Town>town1</Town> <County>county1</County> <PostCode>54545</PostCode> <Country>US</Country> </Address> </Employee> <Employee> <Name>name2</Name> <Address> <Street>street2</Street> <Town>town2</Town> <County>county2</County> <PostCode>45454</PostCode> <Country>UK</Country> </Address> </Employee> </Organization> Would really appreciate if any one here could point me to the right direction. I believe BIND and append/extend will do the job. I have tried them from this link http://sourceforge.net/p/pyxb/discussion/956708/thread/c3da791a/#922f but nothing has worked out so far. Thank you. |
From: Ajinkya F. <aji...@gm...> - 2015-03-25 15:17:42
|
Hi, I recently installed pyxb for generating an XML (that conforms to an XSD) using python bindings (created from the XSD). I've followed http://pyxb.sourceforge.net/userref_pyxbgen.html for creating the python bindings and reading an XML for extracting element values, and that has worked great so far. I'd now like to create an XML using these bindings, and haven't been able to figure that out using http://pyxb.sourceforge.net/userref_usebind.html#demo4c *XML:* <interfaces> <interface> <name>xe-1/0/0</name> <unit> <name>0</name> <family> <inet> <address> <name>10.10.10.1</name> </address> </inet> <inet6> <address> <name>2418:a500:2000:10::11/127</name> </address> </inet6> </family> </unit> </interface> </interfaces> *XSD:* <?xml version="1.0" encoding="utf-8"?> <xs:schema elementFormDefault="qualified" xmlns:xs=" http://www.w3.org/2001/XMLSchema"> <xs:element name="interfaces" type="InterfacesType"/> <xs:complexType name="InterfacesType"> <xs:sequence> <xs:element name="interface" type="InterfaceType"/> </xs:sequence> </xs:complexType> <xs:complexType name="InterfaceType"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="unit" type="UnitType"/> </xs:sequence> </xs:complexType> <xs:complexType name="UnitType"> <xs:sequence> <xs:element name="name" type="xs:decimal"/> <xs:element name="family" type="FamilyType"/> </xs:sequence> </xs:complexType> <xs:complexType name="FamilyType"> <xs:sequence> <xs:element name="inet" type="InetType"/> <xs:element name="inet6" type="Inet6Type"/> </xs:sequence> </xs:complexType> <xs:complexType name="InetType"> <xs:sequence> <xs:element name="address" type="AddressType"/> </xs:sequence> </xs:complexType> <xs:complexType name="Inet6Type"> <xs:sequence> <xs:element name="address" type="AddressType"/> </xs:sequence> </xs:complexType> <xs:complexType name="AddressType"> <xs:sequence> <xs:element name="name" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> *Validation:* $xmllint --noout --schema interfaceXSD.xsd interfaceXML.xml interfaceXML.xml validates $ *Bindings generated:* pyxbgen -u interfaceXSD.xsd -m interfaceCreation *Creating XML from the bindings:* from __future__ import print_function import interfaceCreation import sys inters = interfaceCreation.interfaces() print(inters.toxml("utf-8", element_name='interfaces')) *Errors:* Traceback (most recent call last): File "createInterfaceXMLFromXSD.py", line 10, in <module> print(inters.toxml("utf-8", element_name='interfaces')) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 541, in toxml dom = self.toDOM(bds, element_name=element_name) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 513, in toDOM self._toDOM_csc(bds, element) File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 2647, in _toDOM_csc order = self._validatedChildren() File "/Library/Python/2.7/site-packages/pyxb/binding/basis.py", line 2174, in _validatedChildren return self.__automatonConfiguration.sequencedChildren() File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line 638, in sequencedChildren cfg = self._diagnoseIncompleteContent(symbols, symbol_set) File "/Library/Python/2.7/site-packages/pyxb/binding/content.py", line 493, in _diagnoseIncompleteContent raise pyxb.IncompleteElementContentError(self.__instance, cfg, symbols, symbol_set) pyxb.exceptions_.IncompleteElementContentError: (<interfaceCreation.InterfacesType object at 0x10c291310>, <pyxb.utils.fac.Configuration object at 0x10c291710>, [], {}) Right now, i'm just trying to create the root element (interfaces), but the above error pops up everytime. *If i try to create the next element:* from __future__ import print_function import interfaceCreation import sys inters = interfaceCreation.interfaces() inters.interface.name = "ge-1/0/0" print(inters.toxml("utf-8", element_name='interfaces')) *get the following error:* Traceback (most recent call last): File "createInterfaceXMLFromXSD.py", line 6, in <module> inters.interface.name = "ge-1/0/0" AttributeError: 'NoneType' object has no attribute 'name' I realize this is a basic setup but just can't seem to figure out where the issue lies after following the examples on pyxb. Would really appreciate any help. Thank you. |