     # setting this property by and is deprecated, yet still supported.
     # better pass it as explicitCharkey option to the constructor
     @EXPLICIT_CHARKEY = options.explicitCharkey
+    @ATTRKEY = options.attrkey
+    @CHARKEY = options.charkey
     @resultObject = null
     stack = []
 
     @saxParser.onopentag = (node) =>
       obj = {}
-      obj["#"] = ""
+      obj[@CHARKEY] = ""
       for own key of node.attributes
-        if "@" not of obj
-          obj["@"] = {}
-        obj["@"][key] = node.attributes[key]
+        if @ATTRKEY not of obj
+          obj[@ATTRKEY] = {}
+        obj[@ATTRKEY][key] = node.attributes[key]
 
       # need a place to store the node name
       obj["#name"] = node.name

      trim: true
      # normalize implicates trimming, just so you know
      normalize: true
    # overwrite them with the specified options, if any
    options[key] = value for own key, value of opts


    @saxParser.ontext = @saxParser.oncdata = (text) =>
      s = stack[stack.length - 1]
      if s
        s[@CHARKEY] += text

  parseString: (str) =>
    @saxParser.write str.toString()
