16

I am having a hard time getting started with PyXB.

Say I have an XSD file (an XML schema). I would like to:

  1. Use PyXB to define Python objects according to the schema.
  2. Save those objects to disk as XML files that satisfy the schema.

How can I do this with PyXB? Below is a simple example of an XSD file (from Wikipedia) that encodes an address, but I am having a hard time even getting started.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Address">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="FullName" type="xs:string" />
        <xs:element name="House" type="xs:string" />
        <xs:element name="Street" type="xs:string" />
        <xs:element name="Town" type="xs:string" />
        <xs:element name="County" type="xs:string" minOccurs="0" />
        <xs:element name="PostCode" type="xs:string" />
        <xs:element name="Country" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="IN" />
              <xs:enumeration value="DE" />
              <xs:enumeration value="ES" />
              <xs:enumeration value="UK" />
              <xs:enumeration value="US" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Update

Once I run

pyxbgen -u example.xsd -m example

I get a example.py that has the following classes:

example.Address             example.STD_ANON
example.CTD_ANON            example.StringIO
example.CreateFromDOM       example.pyxb
example.CreateFromDocument  example.sys
example.Namespace           

I think I understand what CreateFromDocument does - it presumably reads an XML and creates the corresponding python object-, but which class do I use to create a new object and then save it to an XML?

Amelio Vazquez-Reina
  • 91,494
  • 132
  • 359
  • 564
  • 3
    I'm struggling with it too, the documentation is absolute bollocks. A huge diagram and complete explanation of what namespaces are is not helpful when you just want to access an element and there's no example that tells you how to do it with namespaces. – Tom Busby Jul 24 '14 at 13:18

1 Answers1

19

A simple google search brings this: http://pyxb.sourceforge.net/userref_pyxbgen.html#pyxbgen

In particular the part that says:

Translate this into Python with the following command:

pyxbgen -u po1.xsd -m po1

The -u parameter identifies a schema document describing contents of a namespace. The parameter may be a path to a file on the local system, or a URL to a network-accessible location like http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd. The -m parameter specifies the name to be used by the Python module holding the bindings generated for the namespace in the preceding schema. After running this, the Python bindings will be in a file named po1.py.

EDIT Following your update:

Now that you have your generated Address class and all the associated helpers, look at http://pyxb.sourceforge.net/userref_usebind.html in order to learn how to use them. For your specific question, you want to study the "Creating Instances in Python Code" paragraph. Basically to generate XML from your application data you simply do:

import example
address = Address()
address.FullName = "Jo La Banane"
# fill other members of address
# ...
with open('myoutput.xml', 'w') as file
    f.write(address.toxml("utf-8"))

Now it's up to you to be curious and read the code being generated, pyxb's doc, call the various generated methods and experiment!

rectummelancolique
  • 2,247
  • 17
  • 13
  • Thanks. I saw examples of this, and I generated the associated python file. I can import it and see the classes, but I don't know which one to use to create an example object and then save it to disk in a schema-conforming XML. – Amelio Vazquez-Reina Jun 26 '13 at 17:02
  • Thanks! This is great. I noticed that `Address()` returns an object where each attribute is of the type `NoneType`, and that it requires me to fill in every field or otherwise I get the exception `IncompleteElementContentError`. I guess that if I want it to create an object with some default values, I would need to write a wrapper around `Address()`. Is my understanding correct, or is there any way to have the automatic class have a constructor with default values? – Amelio Vazquez-Reina Jun 26 '13 at 23:03
  • Read the link I metioned in my update: *Alternatively, you can provide the content as positional parameters in the object creation call* – rectummelancolique Jun 27 '13 at 08:09
  • Thanks again! I was able to create objects from simple XSD schemas, bu I am having problems as soon as I introduce nested elements. I created a different thread in this link: http://stackoverflow.com/questions/17584287/unable-binding-to-pyxb-classes-with-nested-anonymous-types. Not sure why they don't work. – Amelio Vazquez-Reina Jul 11 '13 at 02:59