Revision control

Copy as Markdown

Other Tools

Make duplicate attribute check O(1), detect duplicates in xmlns mode.
diff --git a/sax.js b/sax.js
--- a/sax.js
+++ b/sax.js
@@ -63,6 +63,7 @@
parser.strictEntities = parser.opt.strictEntities
parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
parser.attribList = []
+ parser.attribNames = Object.create(null)
// namespaces form a prototype chain.
// it always points at the current tag,
@@ -688,6 +689,7 @@
tag.ns = parent.ns
}
parser.attribList.length = 0
+ parser.attribNames = Object.create(null)
emitNode(parser, 'onopentagstart', tag)
}
@@ -711,11 +713,11 @@
parser.attribName = parser.attribName[parser.looseCase]()
}
- if (parser.attribList.indexOf(parser.attribName) !== -1 ||
- parser.tag.attributes.hasOwnProperty(parser.attribName)) {
+ if (parser.attribNames[parser.attribName]) {
parser.attribName = parser.attribValue = ''
return
}
+ parser.attribNames[parser.attribName] = true
if (parser.opt.xmlns) {
var qn = qname(parser.attribName, true)
@@ -835,6 +837,7 @@
}
parser.attribName = parser.attribValue = ''
parser.attribList.length = 0
+ parser.attribNames = Object.create(null)
}
function closeTag (parser) {
@@ -905,6 +908,7 @@
if (t === 0) parser.closedRoot = true
parser.tagName = parser.attribValue = parser.attribName = ''
parser.attribList.length = 0
+ parser.attribNames = Object.create(null)
parser.state = S.TEXT
}