后来才发现我们只需这样把字符串按xml的形式传递给底层即可.
var xml='<Setup>'+ '<ProtocolList>'+ '<Protocol>'+ '<Name> onvif </Name>'+ '<UserName> admin </UserName>'+ '<PassWord> admin </PassWord>'+ '<Port> 8000 </Port>'+ '<MediaPort> 8000 </MediaPort>'+ '</Protocol>'+ '<Protocol>'+ '<Name> rtsp </Name>'+ '<UserName> admin </UserName>'+ '<PassWord> admin </PassWord>'+ '<Port>8088</Port>'+ '<MediaPort> 554 </MediaPort>'+ '</Protocol>'+ '<Protocol>'+ '<Name> infinova </Name>'+ '<UserName> admin </UserName>'+ '<PassWord> admin </PassWord>'+ '<Port> 90 </Port>'+ '<MediaPort> 90 </MediaPort>'+ '</Protocol>'+ '</ProtocolList>'+ '<Function>'+ '<PlayBack> onvif </PlayBack>'+ '<Other> rtsp </Other>'+ '</Function>'+'</Setup>'
更新于2017/5/19:在学习了一段时间的React后,知道了其实虚拟DOM就是用js对象结构来表示一个DOM结构,然后进行动态生成和操作,类比我这里生成的XML数据,没有那么复杂,不用去管属性,我这边只需要生成XML格式数据就好,就跟生成HTML标签一样,所以决定借鉴后改一下,这样就不用傻傻地一个个去生成了。
<Setup> <ProtocolList> <Protocol> <Name> onvif </Name> <UserName > admin </UserName> <PassWord > admin </PassWord> <Port> 8000 </Port> <MediaPort> 8000 </MediaPort> </Protocol> <Protocol> <Name> rtsp </Name> <UserName> admin </UserName> <PassWord> admin </PassWord> <Port>8088</Port> <MediaPort> 554 </MediaPort> </Protocol> <Protocol> <Name> infinova </Name> <UserName> admin </UserName> <PassWord> admin </PassWord> <Port> 90 </Port> <MediaPort> 90 </MediaPort> </Protocol> </ProtocolList> <Function> <PlayBack> onvif </PlayBack> <Other> rtsp </Other> </Function></Setup >
动态生成:
function CreatXmlDoc(obj){ this.tagName=obj.tagName; var children=obj.children.map(function(item){ if(typeof item =="object") { item=new CreatXmlDoc(item) } return item }) this.children=children; } CreatXmlDoc.prototype.render=function(){ var el=document.createElement(this.tagName); var children=this.children || []; children.forEach(function(child){ var childEl=(child instanceof CreatXmlDoc) ? child.render() :document.createTextNode(child) el.appendChild(childEl); }) return el } var obj={ tagName:'Setup', children:[ { tagName:'ProtocolList', children:[ { tagName:'Protocol', children:[ { tagName:'Name', children:["onvif"] }, { tagName:'UserName', children:["admin"] }, { tagName:'PassWord', children:["admin"] }, { tagName:'Port', children:["8000"] }, { tagName:'MediaPort', children:["8000"] }, ] }, { tagName:'Protocol', children:[ { tagName:'Name', children:["onvif"] }, { tagName:'UserName', children:["admin"] }, { tagName:'PassWord', children:["admin"] }, { tagName:'Port', children:["8000"] }, { tagName:'MediaPort', children:["8000"] }, ] }, { tagName:'Protocol', children:[ { tagName:'Name', children:["onvif"] }, { tagName:'UserName', children:["admin"] }, { tagName:'PassWord', children:["admin"] }, { tagName:'Port', children:["8000"] }, { tagName:'MediaPort', children:["8000"] }, ] }, ] }, { tagName:'Function', children:[ { tagName:'PlayBack', children:["onvif"] }, { tagName:'Other', children:["rtsp"] } ] } ] } doc=new CreatXmlDoc(obj); SetupSerial=(new XMLSerializer()).serializeToString(doc.render()); var reg = new RegExp(' xmlns="http://www.w3.org/1999/xhtml"',"g"); SetupSerial=SetupSerial.replace(reg,""); console.log(SetupSerial);
(兼容IE8)
动态生成:
Array.prototype.map = function(callback,context){ context = context || window; var newAry = []; for(var i = 0,len = this.length; i < len;i++) { if(typeof callback === 'function') { var val = callback.call(context,this[i],i,this); newAry[newAry.length] = val; } } return newAry; } function CreatXmlDoc(obj){ this.tagName=obj.tagName; var children=obj.children.map(function(item){ if(typeof item =="object") { item=new CreatXmlDoc(item) } return item }) this.children=children; } CreatXmlDoc.prototype.render=function(){ var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); var el=xmlDoc.createElement(this.tagName); var children=this.children || []; children.map(function(child){ var childEl=(child instanceof CreatXmlDoc) ? child.render() :xmlDoc.createTextNode(child) el.appendChild(childEl); }) return el } var xmlObj={ tagName:'Setup', children:[ { tagName:'ProtocolList', children:[ { tagName:'Protocol', children:[ { tagName:'Name', children:["onvif"] }, { tagName:'UserName', children:["admin"] }, { tagName:'PassWord', children:["admin"] }, { tagName:'Port', children:["8000"] }, { tagName:'MediaPort', children:["8000"] }, ] }, { tagName:'Protocol', children:[ { tagName:'Name', children:["onvif"] }, { tagName:'UserName', children:["admin"] }, { tagName:'PassWord', children:["admin"] }, { tagName:'Port', children:["8000"] }, { tagName:'MediaPort', children:["8000"] }, ] }, { tagName:'Protocol', children:[ { tagName:'Name', children:["onvif"] }, { tagName:'UserName', children:["admin"] }, { tagName:'PassWord', children:["admin"] }, { tagName:'Port', children:["8000"] }, { tagName:'MediaPort', children:["8000"] }, ] }, ] }, { tagName:'Function', children:[ { tagName:'PlayBack', children:["onvif"] }, { tagName:'Other', children:["rtsp"] } ] } ] } doc=new CreatXmlDoc(xmlObj); console.log(doc.render().xml)
这样操作起来就方便多了,而且结构也是金字塔式,既方便我们观看,又节约了代码;
2017/5/31今天又来试一下解析xml数据,由于目前只是初步尝试,所以解析数据的时候还没有进行"深解析";
var doc=new CreatXmlDoc( "Setup", [ new CreatXmlDoc( "Protocol", [ new CreatXmlDoc( "Name", [ new CreatXmlDoc( "Name1", [ "onvif1" ] ), ] ), new CreatXmlDoc( "Name2", [ new CreatXmlDoc( "Name1", [ "onvif1" ] ), ] ), ] ), ] ) var res=[]; function parseXml(tag,tagName,dataArray){ $($.parseXML(tag)).find(tagName).each(function(i,item) { if(item.childNodes[0].nodeValue!=null) { dataArray.push(item.childNodes[0].nodeValue); } }) } var doc=doc.render().xml; parseXml(doc,"Name1",res) console.log(res)
目前只能解析形如:<xxx>data</xxx>还没进行嵌套的处理
parseXml(tag,tagName,dataArray)
tag为xml格式的数据
tagName为需要解析的数据的标签名
dataArray为存放数据的数组
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow