您的位置:首页 > Web前端 > JavaScript

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

2017-04-13 10:37 239 查看
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代码在附件。

formatXml.zip (1.1 KB)

下载次数: 28
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: