// Cross browser XMLParser function parseXML(str) { try { var doc; if (window.DOMParser) { var parser = new DOMParser(); doc = parser.parseFromString(str, 'text/xml'); } else { // IE doc = new ActiveXObject('Microsoft.XMLDOM'); doc.async = 'false'; // Remove DOCTYPE ? doc.loadXML(str); } if ( !doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length ) { log('Invalid XML: ' + str); } else { return doc; } } catch (e) { return null; } }
var parseNode = function(xmlNode, parent, parentStyle) { var nodeName = xmlNode.nodeName.toLowerCase(); if (nodeName === 'defs') { inDefine = true; } var styleMap; var el; if (inDefine) { var parser = defineParsers[nodeName]; if (parser) { var def = parser(xmlNode); var id = xmlNode.getAttribute('id'); if (id) { defs[id] = def; } } } else { var parser = nodeParsers[nodeName]; if (parser) { el = parser(xmlNode, parentStyle, defs); if (!el) { log("Unsupported svg node " + nodeName); return; } // 解析通用样式 styleMap = parseAttributes(xmlNode); // PENDING for (var name in parentStyle) { if (!styleMap[name]) { styleMap[name] = parentStyle[name]; } } // 解析坐标变换 var m = parseTransformAttribute(xmlNode); if (m) { el.transform = m; el.decomposeTransform(); } var id = xmlNode.getAttribute('id'); if (id) { el.id = namespace + '/' + id; } // Is a shape if (el.type !== 'group') { extendShapeCommonStyle(el, styleMap, defs); } parent.addChild(el); } } if (inDefine || nodeName === 'g') { var child = xmlNode.firstChild; while (child) { if (child.nodeType === 1){ parseNode(child, el, styleMap); } child = child.nextSibling; } } // Quit define if (nodeName === 'defs') { inDefine = false; } }