def parse(cls, fptr, offset, length):
        """Parse XML box.

        Parameters
        ----------
        fptr : file
            Open file object.
        offset : int
            Start position of box in bytes.
        length : int
            Length of the box in bytes.

        Returns
        -------
        XMLBox
            Instance of the current XML box.
        """
        num_bytes = offset + length - fptr.tell()
        read_buffer = fptr.read(num_bytes)

        if sys.hexversion < 0x03000000 and codecs.BOM_UTF8 in read_buffer:
            # Python3 with utf-8 handles this just fine.  Actually so does
            # Python2 right here since we decode using utf-8.  The real
            # problem comes when __str__ is used on the XML box, and that
            # is where Python2 falls short because of the ascii codec.
            msg = ('A BOM (byte order marker) was detected and '
                   'removed from the XML contents in the box starting at byte '
                   'offset {offset:d}.')
            msg = msg.format(offset=offset)
            warnings.warn(msg, UserWarning)
            read_buffer = read_buffer.replace(codecs.BOM_UTF8, b'')

        try:
            text = read_buffer.decode('utf-8')
        except UnicodeDecodeError as err:
            # Possibly bad string of bytes to begin with.
            # Try to search for <?xml and go from there.
            decl_start = read_buffer.find(b'<?xml')
            if decl_start <= -1:
                # Nope, that's not it.  All is lost.
                msg = ('A problem was encountered while parsing an XML box:'
                       '\n\n\t"{error}"\n\nNo XML was retrieved.')
                warnings.warn(msg.format(error=str(err)), UserWarning)
                return XMLBox(xml=None, length=length, offset=offset)

            text = read_buffer[decl_start:].decode('utf-8')

            # Let the user know that the XML box was problematic.
            msg = ('A UnicodeDecodeError was encountered parsing an XML box '
                   'at byte position {offset:d} ({reason}), but the XML was '
                   'still recovered.')
            msg = msg.format(offset=offset, reason=err.reason)
            warnings.warn(msg, UserWarning)

        # Strip out any trailing nulls, as they can foul up XML parsing.
        text = text.rstrip(chr(0))
        bfptr = io.BytesIO(text.encode('utf-8'))

        try:
            xml = ET.parse(bfptr)
        except ET.ParseError as err:
            msg = ('A problem was encountered while parsing an XML box:'
                   '\n\n\t"{reason}"\n\nNo XML was retrieved.')
            msg = msg.format(reason=str(err))
            warnings.warn(msg, UserWarning)
            xml = None

        return cls(xml=xml, length=length, offset=offset)
Parse XML box.

        Parameters
        ----------
        fptr : file
            Open file object.
        offset : int
            Start position of box in bytes.
        length : int
            Length of the box in bytes.

        Returns
        -------
        XMLBox
            Instance of the current XML box.