XML格式化函数(JS) + 解析XML文本为Doc函数
2017-04-13 10:37
239 查看
XML格式化:
使用:
解析XML文本:
使用:
解析文本后:
JS解析XML文件和XML字符串
http://www.cnblogs.com/chjw8016/archive/2011/07/12/2104269.html
JS代码在附件。
formatXml.zip (1.1 KB)
下载次数: 28
String.prototype.removeLineEnd = function() { return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g, '$1 $2') } function formatXml(text) { //去掉多余的空格 text = '\n' + text.replace(/(<\w+)(\s.*?>)/g, function($0, name, props) { return name + ' ' + props.replace(/\s+(\w+=)/g, " $1"); }).replace(/>\s*?</g, ">\n<"); //把注释编码 text = text.replace(/\n/g, '\r').replace(/<!--(.+?)-->/g, function($0, text) { var ret = '<!--' + escape(text) + '-->'; //alert(ret); return ret; }).replace(/\r/g, '\n'); //调整格式 var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg; var nodeStack = []; var output = text.replace(rgx, function($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2) { var isClosed = (isCloseFull1 == '/') || (isCloseFull2 == '/') || (isFull1 == '/') || (isFull2 == '/'); //alert([all,isClosed].join('=')); var prefix = ''; if (isBegin == '!') { prefix = getPrefix(nodeStack.length); } else { if (isBegin != '/') { prefix = getPrefix(nodeStack.length); if (!isClosed) { nodeStack.push(name); } } else { nodeStack.pop(); prefix = getPrefix(nodeStack.length); } } var ret = '\n' + prefix + all; return ret; }); var prefixSpace = -1; var outputText = output.substring(1); //alert(outputText); //把注释还原并解码,调格式 outputText = outputText.replace(/\n/g, '\r').replace( /(\s*)<!--(.+?)-->/g, function($0, prefix, text) { //alert(['[',prefix,']=',prefix.length].join('')); if (prefix.charAt(0) == '\r') prefix = prefix.substring(1); text = unescape(text).replace(/\r/g, '\n'); var ret = '\n' + prefix + '<!--' + text.replace(/^\s*/mg, prefix) + '-->'; //alert(ret); return ret; }); return outputText.replace(/\s+$/g, '').replace(/\r/g, '\r\n'); } function getPrefix(prefixIndex) { var span = ' '; var output = []; for ( var i = 0; i < prefixIndex; ++i) { output.push(span); } return output.join(''); } function btnFormat_click() { var $ = document.getElementById; $('output').value = formatXml($('input').value); }
使用:
function showInputLog(obj) { var log = $(obj).parent().find("#input").html(); /*log = '<xmp><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '; log += 'xmlns:web="http://WebXml.com.cn/">'; log += ' <soapenv:Header/>'; log += ' <soapenv:Body>'; log += ' <web:getEnCnTwoWayTranslator>'; log += ' <!--Optional:-->'; log += ' <web:Word>HELLO</web:Word>'; log += ' </web:getEnCnTwoWayTranslator>'; log += ' </soapenv:Body>'; log += '</soapenv:Envelope></xmp>';*/ var s = formatXml(log); $('#show_div_log').html("<xmp>"+s+"</xmp>"); $('#win').window('open'); }
解析XML文本:
loadXML = function(xmlString){ var xmlDoc=null; //判断浏览器的类型 //支持IE浏览器 if(!window.DOMParser && window.ActiveXObject){ //window.DOMParser 判断是否是非ie浏览器 var xmlDomVersions = ['MSXML.2.DOMDocument.6.0','MSXML.2.DOMDocument.3.0','Microsoft.XMLDOM']; for(var i=0;i<xmlDomVersions.length;i++){ try{ xmlDoc = new ActiveXObject(xmlDomVersions[i]); xmlDoc.async = false; xmlDoc.loadXML(xmlString); //loadXML方法载入xml字符串 break; }catch(e){ } } } //支持Mozilla浏览器 else if(window.DOMParser && document.implementation && document.implementation.createDocument){ try{ /* DOMParser 对象解析 XML 文本并返回一个 XML Document 对象。 * 要使用 DOMParser,使用不带参数的构造函数来实例化它,然后调用其 parseFromString() 方法 * parseFromString(text, contentType) 参数text:要解析的 XML 标记 参数contentType文本的内容类型 * 可能是 "text/xml" 、"application/xml" 或 "application/xhtml+xml" 中的一个。注意,不支持 "text/html"。 */ domParser = new DOMParser(); xmlDoc = domParser.parseFromString(xmlString, 'text/xml'); }catch(e){ } } else{ return null; } return xmlDoc; }
使用:
var xmlDoc = loadXML(requestXml); var root = xmlDoc.documentElement;
解析文本后:
buildElementDataMap(root); var TEXT_TYPE = "3"; var elementObj = new Object(); //存取XML中解析到的所有值 var editObj = new Object(); //设置编辑值,将XML中获取到的新值赋值给对应的可编辑框 var paraLenObj = new Object(); //记录各参数个数,给多个Item的属性赋值 var xmlCltLenObj = new Object(); //记录Collection或Entity个数,方便解析XML后请求树中添加删除Item /** * 获取Request XML中最新的值 * 获取后返回请求界面可同步 * @param parent */ function buildElementDataMap(parent){ var elements = parent.childNodes; if(elements && checkHasChildren(elements) > 0){ calculateXmlCltLen(parent); for(var i = 0 ; i< elements.length; i++){ var tmp = elements[i]; var nodeType = tmp.nodeType; var nodeName = tmp.localName; if(nodeType == TEXT_TYPE) continue; //文本节点 buildElementDataMap(tmp); } }else{ var nodeType = parent.nodeType; if(nodeType != TEXT_TYPE){ var nodeName = parent.nodeName; var nodeValue; if(document.all){ nodeValue = parent.text; }else{ nodeValue = parent.textContent; } if(nodeName.startsWith("msg") || nodeName.startsWith("esb")) nodeName = nodeName.substring(4); if(nodeValue.trim() != ""){ markupElementObj(nodeName,nodeValue); } } } } /** * 解析XML,组装请求树中参数值的数据源 * @param nodeName * @param nodeValue */ function markupElementObj(nodeName,nodeValue){ var tmp = elementObj[nodeName]; if(tmp == '' || typeof tmp == 'undefined'){ //各参数第一次进入 elementObj[nodeName] = nodeValue; }else{ if(tmp instanceof Array){ //第N次进入,即第N个Item tmp[tmp.length] = nodeValue; elementObj[nodeName] = tmp; }else{ //第二次进入 var tmpArr = []; tmpArr[tmpArr.length] = tmp; tmpArr[tmpArr.length] = nodeValue; elementObj[nodeName] = tmpArr; } } } function checkHasChildren(elements){ var isHas = false; for(var i = 0 ; i< elements.length; i++){ var tmp = elements[i]; var nodeType = tmp.nodeType; if(nodeType != "3"){ //文本节点 isHas = true; break; } } return isHas; }
JS解析XML文件和XML字符串
http://www.cnblogs.com/chjw8016/archive/2011/07/12/2104269.html
JS代码在附件。
formatXml.zip (1.1 KB)
下载次数: 28
相关文章推荐
- 一个格式化文本的JS函数
- 利用MSXML解析XML文本(VC)
- 解析XML文本
- javascript解析xml字符串的函数
- JS解析xml,Ajax访问xml文件
- 利用MSXML解析XML文本(zt)
- 利用MSXML解析XML文本(VC)
- python小例子之3 -- 解析xml文本
- 解析文本 导出XML 拼写检查
- 利用MSXML解析XML文本(VC)
- js如何在IE中动态用xsl来解析xml
- Dom4j递归解析XML实现JS的getElementsByName类似方法
- js 函数深入解析
- JS解析XML
- js解析一个XML字符串 - 跨浏览器的实例
- Js:关于document.execCommand()函数可用参数大解析
- Dom4j递归解析XML实现JS的getElementsByName类似方法
- 脚本代码:实例解析Js+XML的操作方法
- 利用MSXML解析XML文本(VC)
- JS 提交并解析后台返回的XML