Next / Previous / Contents / Shipman's homepage

11.7. BirdForm.readNode() (static method)

As discussed in the introduction to Section 11, “class BirdForm: Notes for one kind of bird”, the translation of XML into an internal data structure does not strictly follow the structure of the XML: a form element with no floc children will be represented as a BirdForm instance with one Sighting instance, while if there are floc children, each of them will be converted to one Sighting instance.

This method requires a txny instance that defines the taxonomy of birds, and also the parent dayNotes instance so that it can check the validity of any location codes used.

birdnotes.py
# - - -   B i r d F o r m . r e a d N o d e

#   @staticmethod
    def readNode ( txny, dayNotes, node ):
        """Convert from XML
        """

The first step is to extract the parts of the form element: the taxon-group attributes, the optional loc-group pattern (which includes child loc-detail elements as well as attributes), and the various sighting-notes child elements. See Section 11.8, “BirdForm.getTaxonGroup() (static method)”, which also builds the basic BirdForm instance.

birdnotes.py
        #-- 1 --
        # [ birdForm  :=  a BirdForm instance with parent dayNotes
        #       made from node's taxon-group ]
        birdForm  =  BirdForm.getTaxonGroup ( txny, dayNotes, node )

At this point we determine whether there any floc children or not.

birdnotes.py
        #-- 2 --
        # [ flocList  :=  node's rnc.FLOC_N children as et.Element
        #                 instances ]
        flocList  =  node.xpath ( rnc.FLOC_N )

At this point, if flocList is empty, this is the single-sighting case; otherwise it is the multi-sighting case.

birdnotes.py
        #-- 3 --
        # [ if flocList is empty ->
        #     birdForm  :=  birdForm with a single Sighting child
        #         added, made from node's age-sex-group, loc-group,
        #         and sighting-notes content
        #   else ->
        #     birdForm  :=  birdForm with loc-group and sighting-notes
        #         added from node, and Sighting children added, made
        #         from the elements of flocList ]
        if  len(flocList) == 0:
            birdForm.singleSighting ( dayNotes, node )
        else:
            birdForm.multiSighting ( dayNotes, node, flocList )

        #-- 4 --
        return birdForm

    readNode  =  staticmethod ( readNode )