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 <pkmu...@gmail.com> 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 <pkmu...@gmail.com> 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
>> pyxb-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/pyxb-users
>>
>
>
------------------------------------------------------------------------------
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
pyxb-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyxb-users