/easyxml

Concise XML generation in Python

Primary LanguagePythonMIT LicenseMIT

EasyXML is an easy and concise way to generate XML output in Python.  It uses a
custom attribute getter so element names can be specified directly in the code:

  books = EasyXML('books')
  books.book(title='Example A')
  books.book.author(name='John Smith', age=57)
  books.book.publisher(name='Publisher A')
  books.book(title='Example B')
  books.book.author(name='Jane Doe', age=30)
  books.book.author(name='James Cutter', age=45)
  books.book.publisher(name='Publisher B')
  print str(books)

The above code produces the following XML:

  <books>
    <book title="Example A">
      <author age="57" name="John Smith"/>
      <publisher name="Publisher A"/>
    </book>
    <book title="Example B">
      <author age="30" name="Jane Doe"/>
      <author age="45" name="James Cutter"/>
      <publisher name="Publisher B"/>
    </book>
  </books>

You don't actually need to create every parent element, allowing the following
code to work:

  root = EasyXML('root')
  root.a.b.c()
  root.a.b.c()
  root.a()
  root.a.b.c()
  root.a.b.c()
  print str(root)

The above code produces the following XML:

  <root>
    <a>
      <b>
        <c/>
        <c/>
      </b>
    </a>
    <a>
      <b>
        <c/>
        <c/>
      </b>
    </a>
  </root>

Creating an element returns that element, which can then be passed to helper
methods:

  def material(primitive, ambient, diffuse):
      primitive.ambient(r=ambient[0], g=ambient[1], b=ambient[2])
      primitive.diffuse(r=diffuse[0], g=diffuse[1], b=diffuse[2])

  root = EasyXML('root')
  material(root.primitive(type='sphere'), (64, 0, 0), (192, 0, 0))
  material(root.primitive(type='cube'), (0, 64, 0), (0, 192, 0))
  print str(root)

The above code produces the following XML:

  <root>
    <primitive type="sphere">
      <ambient b="0" g="0" r="64"/>
      <diffuse b="0" g="0" r="192"/>
    </primitive>
    <primitive type="cube">
      <ambient b="0" g="64" r="0"/>
      <diffuse b="0" g="192" r="0"/>
    </primitive>
  </root>