"readme":"# sax js\n\nA sax-style parser for XML and HTML.\n\nDesigned with [node](http://nodejs.org/) in mind, but should work fine in\nthe browser or other CommonJS implementations.\n\n## What This Is\n\n* A very simple tool to parse through an XML string.\n* A stepping stone to a streaming HTML parser.\n* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML \n docs.\n\n## What This Is (probably) Not\n\n* An HTML Parser - That's a fine goal, but this isn't it. It's just\n XML.\n* A DOM Builder - You can use it to build an object model out of XML,\n but it doesn't do that out of the box.\n* XSLT - No DOM = no querying.\n* 100% Compliant with (some other SAX implementation) - Most SAX\n implementations are in Java and do a lot more than this does.\n* An XML Validator - It does a little validation when in strict mode, but\n not much.\n* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic \n masochism.\n* A DTD-aware Thing - Fetching DTDs is a much bigger job.\n\n## Regarding `<!DOCTYPE`s and `<!ENTITY`s\n\nThe parser will handle the basic XML entities in text nodes and attribute\nvalues: `& < > ' "`. It's possible to define additional\nentities in XML by putting them in the DTD. This parser doesn't do anything\nwith that. If you want to listen to the `ondoctype` event, and then fetch\nthe doctypes, and read the entities and add them to `parser.ENTITIES`, then\nbe my guest.\n\nUnknown entities will fail in strict mode, and in loose mode, will pass\nthrough unmolested.\n\n## Usage\n\n var sax = require(\"./lib/sax\"),\n strict = true, // set to false for html-mode\n parser = sax.parser(strict);\n\n parser.onerror = function (e) {\n // an error happened.\n };\n parser.ontext = function (t) {\n // got some text. t is the string of text.\n };\n parser.onopentag = function (node) {\n // opened a tag. node has \"name\" and \"attributes\"\n };\n parser.onattribute = function (attr) {\n // an attribute. attr has \"name\" and \"value\"\n };\n parser.onend = function () {\n // parser stream is done, and ready to have more stuff written to it.\n };\n\n parser.write('<xml>Hello, <who name=\"world\">world</who>!</xml>').close();\n\n // stream usage\n // takes the same options as the parser\n var saxStream = require(\"sax\").createStream(strict, options)\n saxStream.on(\"error\", function (e) {\n // unhandled errors will throw, since this is a proper node\n // event emitter.\n console.error(\"error!\", e)\n // clear the error\n this._parser.error = null\n this._parser.resume()\n })\n saxStream.on(\"opentag\", function (node) {\n // same object as above\n })\n // pipe is supported, and it's readable/writable\n // same chunks coming in also go out.\n fs.createReadStream(\"file.xml\")\n .pipe(saxStream)\n .pipe(fs.createReadStream(\"file-copy.xml\"))\n\n\n\n##Arguments\n\nPassthefollowingargumentstotheparserfunction.Allareoptional.\n\n`strict`-Boolean.Whetherornottobeajerk.Default:`false`.\n\n`opt`-Objectbagofsettingsregardingstringformatting.Alldefaultto`false`.\n\nSettingssupported:\n\n*`trim`-Boolean.Whetherornottotrimtextandcommentnodes.\n*`normalize`-Boolean.Iftrue,thenturnanywhitespaceintoasingle\nspace.\n*`lowercasetags`-Boolean.Iftrue,thenlowercasetagsinloosemode,\nratherthanuppercasingthem.\n*`xmlns`-Boolean.Iftrue,thennamespacesaresupported.\n\n##Methods\n\n`write`-Writebytesontothestream.Youdon'thavetodothisallat\nonce.Youcankeepwritingasmuchasyouwant.\n\n`close`-Closethestream.Onceclosed,nomoredatamaybewrittenuntil\nitisdoneprocessingthebuffer,whichissignaledbythe`end`event.\n\n`resume`-Togracefullyhandleerrors,assignalistenertothe`error`\nevent.Then,whentheerroristakencareof,youcancall`resume`to\ncontinueparsing.Otherwise,theparserwillnotcontinuewhilei