`
uule
  • 浏览: 6352800 次
  • 性别: 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代码在附件。

分享到:
评论

相关推荐

    格式化xml字符串,并生成xml文件

    这些文件通常包含了处理XML数据的相关工具方法,可能包括读取XML文件、解析XML字符串、格式化XML以及生成新的XML文件等操作。 `XMLFileUtil.java`可能包含了一些与XML文件I/O相关的功能,比如读取XML文件到字符串,...

    C++ XML文件解析库 tinyxml2

    6. **序列化与反序列化**:TinyXML2可以方便地将C++对象序列化为XML格式,并从XML反序列化回对象。只需定义好对象的读写函数,就能实现对象与XML之间的转换。 7. **效率优化**:TinyXML2的设计注重效率,解析速度快...

    \MTK自带的XML解析.doc\MTK自带的XML解析.doc

    传入一个指向`XML_PARSER_STRUCT`结构体的指针,该函数会初始化这个结构体,准备进行XML解析。 2. **关闭解析器**: - `xml_close_parser` 用于释放解析器占用的资源。当解析完成或不再需要解析器时,调用此函数以...

    MFC保存控件数据到xml及读取xml数据到控件

    XML(eXtensible Markup Language)是一种用于存储和传输结构化数据的标准格式。在MFC应用中,我们可以利用XML文件来持久化控件的状态,如EDIT控件的文本、LISTCTRL控件的选中项、BUTTON控件的按下状态等。 接下来...

    Javascript格式化并高亮xml字符串的方法及注意事项

    在JavaScript中,处理XML数据时,我们经常需要将XML字符串格式化并高亮显示,以增强可读性。本文将详细介绍如何使用DOMParser解析XML字符串,并递归遍历XML树来实现这一目标。 首先,XML(Extensible Markup ...

    MATLAB读取XML格式的数据文件

    MATLAB还提供了一个`xmlwrite`函数,用于将数据写入XML文件,这在你需要保存MATLAB处理后的结果到XML格式时非常有用。 在提供的压缩包文件"xml_toolbox"中,可能包含了一些实用的工具或示例,帮助用户更方便地进行...

    TinyXML-2(XML解析)

    TinyXML-2的主要功能就是解析XML文档,将XML结构转换为C++对象,这些对象可以被方便地遍历和修改,然后再将结果序列化回XML格式。 1. **基本用法**: - 解析XML文档:使用`XMLDocument`类加载XML文件或XML字符串,...

    自己写的一个linux下的xml解析例子

    首先,libxml2库提供了多种API接口,包括解析XML文档、创建XML结构、序列化XML结构以及XPath查询等功能。在解析XML文档时,我们通常会使用`xmlReadFile()`或`xmlReadMemory()`函数,它们可以读取文件或内存中的XML...

    QT解析xml文档 读取写入

    XML(eXtensible Markup Language)是一种结构化数据格式,常用于存储和传输数据。 XML文档由一系列元素组成,每个元素都有可能包含其他元素、文本内容或属性。QT中的QDomDocument类用于表示整个XML文档,它可以...

    java解析xml的4种方法和json格式

    在Java编程语言中,XML(eXtensible Markup Language)是一种常见的数据交换格式,用于存储和传输结构化数据。而JSON(JavaScript Object Notation)则是另一种轻量级的数据交换格式,因其简洁和易于读写而广泛使用...

    Qt读写Xml文件,QTreeWidget显示Xml和导出Xml文件

    在Qt框架中,XML文件是一种常见的数据存储格式,它提供了结构化的数据表示方式,便于程序读取和写入。QTreeWidget是Qt提供的一种用于显示树状结构数据的控件,它可以很好地展示XML文件的层次结构。QXml是Qt中的XML...

    Android XML 解析笔记

    在解析过程中,每当遇到XML文档的开始标签、结束标签或文本内容等特定事件时,都会触发相应的事件处理函数。这种方式非常适合于流式处理和实时分析,因为它不会将整个文档加载到内存中。 **特点:** - **优点:** ...

    XML文件c语言 dom和sax模式解析

    XML(eXtensible Markup Language)是一种用于存储和交换结构化数据的标准格式,广泛应用于软件开发、网络通信和数据存储等领域。在C语言环境中,处理XML文件时,通常有两种主要的解析模式:DOM(Document Object ...

    XML文件的解析--libxml库函数解释

    1. **xmlReadFile()**:这个函数用于从磁盘或网络读取XML文件,并将其转换为一个XML解析树。例如: ```c xmlDocPtr doc = xmlReadFile("example.xml", "UTF-8", XML_PARSE_RECOVER); ``` 这里,`xmlReadFile()`...

    Aandroid 解析xml参考文献

    在Android开发中,XML(eXtensible Markup Language)是一种常用的数据交换格式,它用于存储结构化数据。本文将深入探讨Android平台下解析XML的三种主要方法:SAX(Simple API for XML)、DOM(Document Object ...

    c# 利用泛型解析xml文件

    XML是一种常用的数据交换格式,用于存储和传输结构化数据。下面我们将详细探讨如何实现这个过程。 首先,我们需要理解XML的基本结构。XML文档由元素、属性、文本内容等组成,通过层次结构表示数据。在C#中,我们...

    php 实现post xml并解析

    首先,实例化`DOMDocument`对象,然后使用`createElement`方法创建元素节点,`nodeValue`设置文本内容,最后用`saveXML`方法将整个文档转换为字符串。 ```php $doc = new DOMDocument('1.0', 'UTF-8'); $root = ...

    Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法

    在Python编程中,XML(可扩展标记语言)是一种常见的数据交换格式,用于存储和传输结构化数据。Python提供了多种库来处理XML文件,其中最常用的两个模块是`xml.dom.minidom`和`xml.etree.ElementTree`。本文将详细...

Global site tag (gtag.js) - Google Analytics