    /*
     * call-seq:
     *  root=
     *
     * Set the root element on this document
     */
    static VALUE set_root(VALUE self, VALUE root)
    {
      xmlDocPtr doc;
      xmlNodePtr new_root;
      xmlNodePtr old_root;

      Data_Get_Struct(self, xmlDoc, doc);

      old_root = NULL;

      if(NIL_P(root)) {
        old_root = xmlDocGetRootElement(doc);

        if(old_root) {
          xmlUnlinkNode(old_root);
          NOKOGIRI_ROOT_NODE(old_root);
        }

        return root;
      }

      Data_Get_Struct(root, xmlNode, new_root);

      /* If the new root's document is not the same as the current document,
       * then we need to dup the node in to this document. */
      if(new_root->doc != doc) {
        old_root = xmlDocGetRootElement(doc);
        if (!(new_root = xmlDocCopyNode(new_root, doc, 1))) {
          rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
        }
      }

      xmlDocSetRootElement(doc, new_root);
      if(old_root) NOKOGIRI_ROOT_NODE(old_root);
      return root;
    }