Files
LayaNative2.0/Conch/source/domsupport/DomParser.ts
T
2020-11-11 16:17:13 +08:00

171 lines
3.7 KiB
TypeScript

class DOMParser
{
private _parser:_DOMParser;
private _src:string;
private _onload:()=>void;
private _onerror:()=>void;
private _result:_jsXmlDocument;
constructor() {
this._parser=new _DOMParser();
}
set src(s)
{
this._src=location.resolve(s);
//this._src = encodeURI(this._src);
this._parser.src=this._src;
}
get src()
{
return this._src;
}
set onload(callback)
{
this._parser._onload=callback;
this._parser.onload=this.nativeObjOnload;
}
private nativeObjOnload()
{
this._onload();
}
get onload()
{
return this._parser._onload;
}
set onerror(callback)
{
this._parser._onerror=callback;
this._parser.onerror=this.nativeObjOnerror;
}
private nativeObjOnerror()
{
this._onerror();
}
get onerror()
{
return this._parser._onerror;
}
private static initXMl(xml:_XmlNode):_jsXmlNode
{
var result:_jsXmlNode;
if(!xml)
{
var temp=new _jsXmlNode();
temp.nodeName="parsererror";
temp.textContent="parsererror error";
result=new _jsXmlNode();
result.childNodes[0]=temp;
return result;
}
result=new _jsXmlNode();
result.nodeName=xml.nodeName;
result.nodeValue=xml.nodeValue;
result.nodeType=1;
if(result.nodeName=="#cdata-section")
{
result.nodeType=3;
result.nodeName="#text";
}
result.textContent=xml.textContent;
var attrs=xml.attributes;
for(var i=0,sz1=attrs.length;i<sz1;i++)
{
var attr=attrs[i];
var key=attr.nodeName;
var tempAttr=new _jsXmlAttr(key,attr.nodeValue);
result.attributes[i]=tempAttr;
result.attributes[key]=tempAttr;
}
var childs=xml.childNodes;
for(var i=0,sz1=childs.length;i<sz1;i++)
{
var chd=childs[i];
var nodeName=chd.nodeName;
result.childNodes[i]=DOMParser.initXMl(chd);
}
return result;
}
parseFromString(s:string,t:string):_jsXmlDocument
{
var xml= this._parser.parseFromString(s,t);
var root=new _jsXmlDocument();
root.childNodes[0]=DOMParser.initXMl(xml.childNodes[0]);
return root;
}
getResult():_jsXmlDocument
{
if(!this._result)
{
this._result=new _jsXmlDocument();
this._result.childNodes[0]=DOMParser.initXMl(this._parser.getResult().childNodes[0]);
}
return this._result;
}
}
window["DOMParser"] =DOMParser;
class _jsXmlAttr
{
nodeName:string;
nodeValue:string;
textContent:string;
constructor(key:string,value:string)
{
this.nodeName=key;
this.nodeValue=this.textContent=value;
}
get value()
{
return this.nodeValue;
}
}
class _jsXmlNode extends _jsXmlAttr
{
childNodes:Array<_jsXmlNode>;
attributes:Array<_jsXmlAttr>;
nodeType:number;
get firstChild()
{
return this.childNodes?this.childNodes[0]:null;
}
constructor()
{
super("","");
this.childNodes=[];
this.childNodes["item"]=function(i:any)
{
return this[i];
}
this.attributes=[];
}
getElementsByTagName(name:string):Array<_jsXmlNode>
{
var result:Array<_jsXmlNode>=[];
if(this.nodeName==name)
result.push(this);
else
{
for(var i=0,n=this.childNodes.length;i<n;i++)
{
var son=this.childNodes[i];
result=result.concat(son.getElementsByTagName(name));
}
}
return result;
}
getAttribute(name:string):string
{
var attr=this.attributes[name];
return attr?attr["nodeValue"]:"";
}
}
class _jsXmlDocument extends _jsXmlNode
{
}