def deserializexml(self, xmlelement):
        """

        :type xmlelement: xml.etree.ElementTree.Element
        """
        # Load from each XML attribute.
        self.versionNumber = int(xmlelement.get("versionNumber"))
        self.docType = int(xmlelement.get("docType"))
        self.width = int(xmlelement.get("width"))
        self.height = int(xmlelement.get("height"))
        self.usedCount = int(xmlelement.get("usedCount"))
        self.backgroundColor = NSColor(RGBAstring=xmlelement.get("backgroundColor"))
        self.buildNumber = int(xmlelement.get("buildNumber", default=str(self.buildNumber)))
        self.drawingBackgroundColor = xmlelement.get("drawingBackgroundColor").lower() == "true"
        self.CCLIDisplay = xmlelement.get("CCLIDisplay").lower() == "true"
        self.lastDateUsed = RVDateTime(datetimestring=xmlelement.get("lastDateUsed"))
        self.selectedArrangementID = xmlelement.get("selectedArrangementID")
        self.category = xmlelement.get("category")
        self.resourcesDirectory = xmlelement.get("resourcesDirectory")
        self.notes = xmlelement.get("notes")
        self.os = int(xmlelement.get("os", default=str(self.buildNumber)))
        self.CCLIAuthor = xmlelement.get("CCLIAuthor")
        self.CCLIArtistCredits = xmlelement.get("CCLIArtistCredits")
        self.CCLISongTitle = xmlelement.get("CCLISongTitle")
        self.CCLIPublisher = xmlelement.get("CCLIPublisher")
        self.CCLICopyrightYear = xmlelement.get("CCLICopyrightYear")
        self.CCLISongNumber = xmlelement.get("CCLISongNumber")
        self.chordChartPath = xmlelement.get("chordChartPath")

        xml_timeline = xmlelement.find("RVTimeline")
        if xml_timeline is not None:
            self.timeline = RVTimeline(xml_timeline)

        # Build the bible reference.
        xml_biblereference = xmlelement.find("RVBibleReference")
        if xml_biblereference is not None:
            self.biblereference = RVBibleReference(xml_biblereference)

        # Use XPath to find the arrangements object and the groups object
        xml_arrangements = xmlelement.find("./*[@rvXMLIvarName='arrangements']")
        xml_groups = xmlelement.find("./*[@rvXMLIvarName='groups']")

        # Create the slide groups.
        for xml_group in xml_groups:
            self.groups.append(RVSlideGrouping(xml_group))
class RVPresentationDocument(RVObject):
    def __init__(self, xmlelement=None):
        # Create all variables here.
        self.versionNumber = 600
        self.docType = 0
        self.width = 1280
        self.height = 720
        self.usedCount = 0
        self.backgroundColor = NSColor()
        self.buildNumber = 15122
        self.drawingBackgroundColor = False
        self.CCLIDisplay = True
        self.lastDateUsed = RVDateTime()
        self.selectedArrangementID = ""
        self.category = "Default"
        self.resourcesDirectory = ""
        self.notes = ""
        self.os = 2
        self.CCLIAuthor = ""
        self.CCLIArtistCredits = ""
        self.CCLISongTitle = ""
        self.CCLIPublisher = ""
        self.CCLICopyrightYear = ""
        self.CCLISongNumber = ""
        self.chordChartPath = ""

        # Create child objects here.
        self.biblereference = None
        self.timeline = None
        self.arrangements = []
        self.groups = []

        if xmlelement is None:
            return

        # Load variables from XML.
        self.deserializexml(xmlelement)

    def deserializexml(self, xmlelement):
        """

        :type xmlelement: xml.etree.ElementTree.Element
        """
        # Load from each XML attribute.
        self.versionNumber = int(xmlelement.get("versionNumber"))
        self.docType = int(xmlelement.get("docType"))
        self.width = int(xmlelement.get("width"))
        self.height = int(xmlelement.get("height"))
        self.usedCount = int(xmlelement.get("usedCount"))
        self.backgroundColor = NSColor(RGBAstring=xmlelement.get("backgroundColor"))
        self.buildNumber = int(xmlelement.get("buildNumber", default=str(self.buildNumber)))
        self.drawingBackgroundColor = xmlelement.get("drawingBackgroundColor").lower() == "true"
        self.CCLIDisplay = xmlelement.get("CCLIDisplay").lower() == "true"
        self.lastDateUsed = RVDateTime(datetimestring=xmlelement.get("lastDateUsed"))
        self.selectedArrangementID = xmlelement.get("selectedArrangementID")
        self.category = xmlelement.get("category")
        self.resourcesDirectory = xmlelement.get("resourcesDirectory")
        self.notes = xmlelement.get("notes")
        self.os = int(xmlelement.get("os", default=str(self.buildNumber)))
        self.CCLIAuthor = xmlelement.get("CCLIAuthor")
        self.CCLIArtistCredits = xmlelement.get("CCLIArtistCredits")
        self.CCLISongTitle = xmlelement.get("CCLISongTitle")
        self.CCLIPublisher = xmlelement.get("CCLIPublisher")
        self.CCLICopyrightYear = xmlelement.get("CCLICopyrightYear")
        self.CCLISongNumber = xmlelement.get("CCLISongNumber")
        self.chordChartPath = xmlelement.get("chordChartPath")

        xml_timeline = xmlelement.find("RVTimeline")
        if xml_timeline is not None:
            self.timeline = RVTimeline(xml_timeline)

        # Build the bible reference.
        xml_biblereference = xmlelement.find("RVBibleReference")
        if xml_biblereference is not None:
            self.biblereference = RVBibleReference(xml_biblereference)

        # Use XPath to find the arrangements object and the groups object
        xml_arrangements = xmlelement.find("./*[@rvXMLIvarName='arrangements']")
        xml_groups = xmlelement.find("./*[@rvXMLIvarName='groups']")

        # Create the slide groups.
        for xml_group in xml_groups:
            self.groups.append(RVSlideGrouping(xml_group))

    def serializexml(self):
        xmlelement = xmltree.Element("RVPresentationDocument")
        xmlelement.set("versionNumber", str(self.versionNumber))
        xmlelement.set("docType", str(self.docType))
        xmlelement.set("drawingBackgroundColor", str(self.drawingBackgroundColor).lower())
        xmlelement.set("width", str(self.width))
        xmlelement.set("height", str(self.height))
        xmlelement.set("usedCount", str(self.usedCount))
        xmlelement.set("backgroundColor", str(self.backgroundColor))
        xmlelement.set("buildNumber", str(self.buildNumber))
        xmlelement.set("CCLIDisplay", str(self.CCLIDisplay).lower())
        xmlelement.set("lastDateUsed", str(self.lastDateUsed))
        xmlelement.set("selectedArrangementID", str(self.selectedArrangementID))
        xmlelement.set("category", str(self.category))
        xmlelement.set("resourcesDirectory", str(self.resourcesDirectory))
        xmlelement.set("notes", str(self.notes))
        xmlelement.set("os", str(self.os))
        xmlelement.set("CCLIAuthor", str(self.CCLIAuthor))
        xmlelement.set("CCLIArtistCredits", str(self.CCLIArtistCredits))
        xmlelement.set("CCLISongTitle", str(self.CCLISongTitle))
        xmlelement.set("CCLIPublisher", str(self.CCLIPublisher))
        xmlelement.set("CCLICopyrightYear", str(self.CCLICopyrightYear))
        xmlelement.set("CCLISongNumber", str(self.CCLISongNumber))
        xmlelement.set("chordChartPath", str(self.chordChartPath))

        # Serialize back out to xml.
        if self.timeline is not None:
            xmlelement.append(self.timeline.serializexml())

        if self.biblereference is not None:
            xmlelement.append(self.biblereference.serializexml())

        # Serialize the groups list.
        rvGroupsArrayElement = self.createarray("groups")
        for cslidegroup in self.groups:
            rvGroupsArrayElement.append(cslidegroup.serializexml())
        xmlelement.append(rvGroupsArrayElement)

        # Serialize the arrangements list.
        rvArrangementsArrayElement = self.createarray("arrangements")
        xmlelement.append(rvArrangementsArrayElement)

        return xmlelement