    /*
     * call-seq:
     *   attribute(name)
     *
     * Get the value of attribute named +name+
     */
    static VALUE reader_attribute(VALUE self, VALUE name)
    {
      xmlTextReaderPtr reader;
      xmlChar *value ;
      VALUE rb_value;

      Data_Get_Struct(self, xmlTextReader, reader);

      if(NIL_P(name)) return Qnil;
      name = StringValue(name) ;

      value = xmlTextReaderGetAttribute(reader, (xmlChar*)StringValuePtr(name));
      if(value == NULL) {
        /* this section is an attempt to workaround older versions of libxml that
           don't handle namespaces properly in all attribute-and-friends functions */
        xmlChar *prefix = NULL ;
        xmlChar *localname = xmlSplitQName2((xmlChar*)StringValuePtr(name), &prefix);
        if (localname != NULL) {
          value = xmlTextReaderLookupNamespace(reader, localname);
          xmlFree(localname) ;
        } else {
          value = xmlTextReaderLookupNamespace(reader, prefix);
        }
        xmlFree(prefix);
      }
      if(value == NULL) return Qnil;

      rb_value = NOKOGIRI_STR_NEW2(value);
      xmlFree(value);
      return rb_value;
    }