`
uule
  • 浏览: 6311872 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

XML格式化函数(JS) + 解析XML文本为Doc函数

 
阅读更多

XML格式化:

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代码在附件。

分享到:
评论

相关推荐

    基于Java的XML解析与反射设计模式.doc

    基于Java的XML解析与反射设计模式 摘要:随着计算机时代的蓬勃发展,internet的普及给社会以及人民的生活带来了巨 大的影响。与此同时,b/s结构的多系统相互访问技术应时代的发展也如雨后春笋般不断 涌现出来,相应...

    c++ 操作xml , CMarkup库 的使用

    cmarkup是把整个xml文件作为字符串载入内存,再利用字符串类提供的函数进行访问,MFC环境下是...第二步:xml格式的创建 CMarkup xml; CreateXmlData(xml); void CreateXmlData(CMarkup &xml) { xml.SetDoc(_T(\r\n));

    Go 语言程序设计

    3.5.6 为调试格式化 78 3.6 其他字符处理相关的包 80 3.6.1 strings包 81 3.6.2 strconv包 86 3.6.3 utf8包 90 3.6.4 unicode包 91 3.6.5 regexp包 92 3.7 例子:m3u2pls 101 3.8 练习 106 第4章...

    ExcelVBA程序设计.doc

    三、学习微软 EXCEL 2002 VBA 编程和XML,ASP技术 22 第一章 电子表格自动化简介和了解宏命令 22 1了解宏 22 2宏命令的普通应用 22 3写宏之前的计划 23 4录制宏 24 5运行宏 26 6修改宏代码 26 7添加注释 29 8分析宏...

    JSTL(JSP Standard Tag Library).doc

    1.JSTL(JSP Standard Tag Library)是一套预先定义好、协助程序员简化JSP网页制作的标签函数库。规格包含各种网页运作所需的运用,如循环、流程控制、输入输出、文本格式化,甚至XML文件处理及数据库访问操作等;

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 format字符串格式化 08 数学意义的函数与python中的函数 09 为何要有函数 10 函数返回值 11 可变长参数 第15章 01 上节课复习 02 全局变量与局部变量 03 风湿理论之函数即变量 04 函数递归 05 函数递归补充 第...

    jpivot学习总结.doc

    formatter 该属性定义了 Member.getCaption() 方法返回的动作值,这里需要是一个实现了 mondrian.olap.MemberFormatter 接口的类,用来对 Caption 地值进行格式化。 3.6. Join 对于一个 Hierarchy 来说,有两种...

    一种大数据智能分析平台的数据分析方法及实现技术.doc

    常见的非结构化数据包括XML、文本、图象、声音、影音、各类应用软件 产生的文件。 针对包含文字、数据的为结构化数据应当先利用数据清洗、数据治理工具进行 提取,这项工作目前仍依赖技术员进行操作,由于格式的复杂...

    易语言 茶凉专用模块

    子程序 到短路径, 文本型, 公开, 取指定路径的短路径名(返回收缩后的路径,无效返回空文本)如: c:\program files\ 收缩后为:C:\PROGRA~1\ .参数 文件名, 文本型, , 原路径 .子程序 到任意进制, 文本型, 公开, 可以将...

    数据库设计规范(3).doc

    5 3.9 函数(Function)的命名规则 5 3.10 索引(Index) 命名规范 5 3.11 约束(Constraint) 命名规范 5 4 数据模型产出物规范 5 附录A:xml文件使用说明 7 附录B:保留关键字 8 编写目的 本文的目的是提出针对Oracle...

    Visual JDevpro

    13、支持代码缩进以及自动格式化等; 14、支持代码自动完成; 15、支持编译java程序,可以快速定位错误所在位置; 16、支持通用的编辑功能,如剪切、拷贝、粘贴等; 17、支持书签功能; 18、编辑区支持多种选择...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    DSkinLite界面库采用XML管理GDI元素,并独创了将界面元素抽象为图片,矩形,线条,文字等元素。任何 一个控件界面均可以由这些元素来组合,使用DSkinLite可以轻松配置各种界面效果。如下图所示: 由此在一个控件...

    金山WPS Office 2012 V9.1.0.4397 个人安装版.exe

     10 优化表格计算、域计算、数值格式化效率;  11 优化文字工具操作效率;  12 优化WPS文字查找、替换效率;  13 优化以html格式进行复制粘贴的显示效果。  WPS表格:  1 改进无法按月末日期进行序列填充...

    VC6使用word2003生成报表的示例

    wordDll为库的代码,TestDll为使用示例,宏.txt是格式化段落的宏 &lt;br&gt;附加:如果想知道函数中使用的值应该为多少,可以在Word操作的时候录制宏,然后使用单步调试的方式得到想要的值。 注:本着开源的精神,把...

    C#微软培训资料

    10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 .124 11.1 方法的声明.124 11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 ...

Global site tag (gtag.js) - Google Analytics