qiBuild documentation

qixml module

This is just a set of convenience functions to be used with The ElemtTree XML API <http://docs.python.org/library/xml.etree.elementtree.html>

qisys.qixml.XMLParser

class qisys.qixml.XMLParser(target)

This class provides an easy interface to parse XML tags element by element. To work with it, you must inherit from this class and define methods on tags you want to parse.

parse(root)

This function iterates on the children of the element (or the root if an element is not given) and call _parse_TAGNAME functions. :param root: The root element that should be parsed.

check_needed(attribute_name, node_name=None, value=None)

Raise an Exception if a required attribute is missing

xml_elem(node_name=None)

Get the xml representation of the target Will set attributes of the node using attributes of the target, except if _dump_<attribute> class exits

Example:

<foo>
  <bar attr1="fooooooo">Some content!</bar>
  <easy><win>Yes!</win></easy>
  <win>Nooooooooooooooooooooooooooooooooo!</win>
</foo>

Root of the XML is foo. When XMLParser.parse is called, it will try to call _parse_TAGNAME where tag name is the actual name of the tag you want to parse. It takes the element as a parameter.

You can call parse recursively (from _parse_TAGNAME functions) to parse sub-trees. You always have backtrace to know from where you came in _parse_TAGNAME. Here is a complete example of a usage on XML above

class Foo(XMLParser):
    def _parse_bar(self, element):
        print('Attribute attr1:', element.attrib['attr1'])
        print('Content:', element.text)

    def _parse_easy(self, element):
        self.parse(element)

    def _parse_win(self, element):
        # We only want to parse win tag in easy tag.
        if 'easy' in self.backtrace:
            print('Win text:', element.text)

A parser class should not have an attribute with the name of an xml attribute unless it wants to grab them.