docs: def getCanonicalID(iname, xrd_tree):
      """Return the CanonicalID from this XRDS document.
  
      @param iname: the XRI being resolved.
      @type iname: unicode
  
      @param xrd_tree: The XRDS output from the resolver.
      @type xrd_tree: ElementTree
  
      @returns: The XRI CanonicalID or None.
      @returntype: unicode or None
      """
      xrd_list = xrd_tree.findall(xrd_tag)
      xrd_list.reverse()
  
      try:
          canonicalID = xri.XRI(xrd_list[0].findall(canonicalID_tag)[0].text)
      except IndexError:
          return None
  
      childID = canonicalID.lower()
  
      for xrd in xrd_list[1:]:
          # XXX: can't use rsplit until we require python >= 2.4.
          parent_sought = childID[:childID.rindex('!')]
          parent = xri.XRI(xrd.findtext(canonicalID_tag))
          if parent_sought != parent.lower():
              raise XRDSFraud("%r can not come from %s" % (childID, parent))
  
          childID = parent_sought
  
      root = xri.rootAuthority(iname)
      if not xri.providerIsAuthoritative(root, childID):
          raise XRDSFraud("%r can not come from root %r" % (childID, root))
  
      return canonicalID