`
sungang_1120
  • 浏览: 322121 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

XMLUtils 封装通用的javascript解析XML文件

阅读更多

XMLUtils.js

function XmlUtils(config) {
	/* 定义私有属性 */
	this.isIE = !!(window.attachEvent && !window.opera);
	this.init();
	if (config) {
		this.dataType = config.dataType == 'json' ? 'json' : 'array';
		if (config.xmlPath)
			this.loadXml(config.xmlPath);
	}

}

XmlUtils.prototype = {
	xmlDoc : null,
	xmlPath : null,
	dataType : null,

	/**
	 * 初始化
	 */

	init : function() {
		if (this.isIE) {
			var activexArr = [ "MSXML4.DOMDocument", "MSXML3.DOMDocument",
					"MSXML2.DOMDocument", "MSXML.DOMDocument",
					"Microsoft.XmlDom" ];
			for ( var i = 0; i < activexArr.length; i++) {
				try {
					this.xmlDoc = new ActiveXObject(activexArr[i]);
				} catch (e) {

				}
			}
		} else {
			this.xmlDoc = document.implementation.createDocument("", "", null);
		}
	},
	/**
	 * 加载xml文件,参数:
	 * 
	 * @param {string}
	 *            xmlPath:加载的xml文件路径;
	 * @return {Object} true 正常加载; false 加载失败
	 */
	loadXml : function(xmlPath) {
		try {
			this.xmlDoc.async = false;
			this.xmlDoc.load(xmlPath);
			this.xmlPath = xmlPath;
			return true;
		} catch (e) {
			return false;
		}
	},
	/**
	 * 加载XML字符串
	 * 
	 * @param {Object}
	 *            XMLString
	 */
	loadXmlString : function(xmlString) {
		if (this.isIE) {
			this.xmlDoc.loadXML(xmlString);
		} else {
			var parser = new DOMParser();
			this.XMLDoc = parser.parseFromString(xmlString, "text/xml");
		}
	},

	/**
	 * 判断节点的是否有子节点
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 有子节点则返回true,否则返回false
	 */
	hasChildNodes : function(node) {
		return node.hasChildNodes();
	},

	/**
	 * 判断节点的是否有属性
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 有属性则返回true,否则返回false
	 */
	hasAttributes : function(node) {
		return (node.attributes.length > 0) ? true : false;
	},

	/**
	 * 判断节点的是否是文本节点,包括带CDATA区段的文本节点
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 是文本节点则返回true,否则返回false
	 */
	isTextNode : function(node) {
		var type = this.getNodeType(node);
		return (type == 3 || type == 4) ? true : false;
	},
	/**
	 * 返回根节点
	 * 
	 * @return {Object} 根节点
	 */
	getRoot : function() {
		return this.xmlDoc.documentElement;
	},
	/**
	 * 返回节点的第一个子节点,没有参数则返回根节点的第一个子节点
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 节点的第一个子节点
	 */
	getFirstChild : function(node) {
		return node ? node.firstChild : this.getRoot().firstChild;
	},
	/**
	 * 返回节点的最后子节点,没有参数则返回根节点的第一个子节点
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 节点的最后一个子节点
	 */
	getLastChild : function(node) {
		return node ? node.lastChild : this.getRoot().lastChild;
	},
	/**
	 * 返回节点的下一个节点,没有参数则返回根节点的第一个子节点
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 节点的下一个节点
	 */
	getNextNode : function(node) {
		return node ? node.nextSibling : null;
	},
	/**
	 * 返回节点的上一个节点,没有参数则返回根节点的第一个子节点
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 节点的上一个节点
	 */
	getPreviousNode : function(node) {
		return node ? node.previousSibling : null;
	},
	/**
	 * 返回节点的子节点,没有参数则返回null
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 节点所有子节点
	 */
	getChildNodes : function(node) {
		return (node && this.hasChildNodes(node)) ? node.childNodes : null;
	},
	/**
	 * 返回节点的父节点,没有参数则返回null
	 * 
	 * @param {Object}
	 *            node
	 * @return {Object} 节点父节点
	 */
	getParentNode : function(node) {
		return node ? node.parentNode : null;
	},
	/**
	 * 根据节点名返回节点数组文本值,参数:
	 * 
	 * @param {string或object}
	 *            nodeName:节点名称;
	 * @return {object} 节点存在返回节点数组;节点不存在则返回null。
	 */
	getNodesTextByName : function(nodeNames) {
		return nodeNames ? (this.dataType == 'json' ? this
				.getJsonNodesTextByName(nodeNames) : this
				.getArryNodesTextByName(nodeNames)) : null;
	},
	/**
	 * 根据节点名返回节点普通数组文本值,参数:
	 * 
	 * @param {string或object}
	 *            nodeName:节点名称;
	 * @return {object} 节点存在返回节点普通数组。
	 */
	getArryNodesTextByName : function(nodeNames) {
		var rs = [];
		// 返回普通数组格式
		switch (typeof (nodeNames)) {
		case 'string':
			var nodes = this.getNodesByTagName(nodeNames);
			for ( var i = 0; i < nodes.length; i++) {
				rs.push(nodes[i].text);
			}
			break;
		case 'object':
			var subRs;
			var nodes;
			for ( var i = 0; i < nodeNames.length; i++) {
				nodes = this.getNodesByTagName(nodeNames[i]);
				subRs = [];
				for ( var j = 0; j < nodes.length; j++) {
					subRs.push(nodes[j].text);
				}
				rs.push(subRs);
			}
			break;
		}
		return rs;
	},
	/**
	 * 根据节点名返回节点JSON数组文本值,参数:
	 * 
	 * @param {string或object}
	 *            nodeName:节点名称;
	 * @return {object} 节点存在返回节点JSON数组;节点不存在则返回null。
	 */
	getJsonNodesTextByName : function(nodeNames) {
		var rs = null;
		// 返回JSON数组格式
		switch (typeof (nodeNames)) {
		case 'string':
			eval('rs = {' + nodeNames + ':[]}');
			var nodes = this.getNodesByTagName(nodeNames);
			for ( var i = 0; i < nodes.length; i++) {
				eval('rs.' + nodeNames + '.push({' + nodeNames + i
						+ ': nodes[i].text})');
			}
			break;
		case 'object':
			rs = {};
			var nodes;
			for ( var i = 0; i < nodeNames.length; i++) {
				eval('rs.' + nodeNames[i] + '=[]');
				nodes = this.getNodesByTagName(nodeNames[i]);
				for ( var j = 0; j < nodes.length; j++) {
					eval('rs.' + nodeNames[i] + '.push({' + nodeNames[i] + j
							+ ': nodes[j].text})');
				}
			}
			break;
		}
		return rs;
	},

	/**
	 * 根据节点属性得到节点,参数:
	 * 
	 * @param {String}
	 *            key:属性名,默认是id
	 * @param {String}
	 *            value:属性值
	 * @return {String} 符合条件的节点数组。
	 */
	getNodesByAttribute : function(key, value) {
		key = key ? key : 'id';
		value = value ? value : '';
		return id ? this.xmlDoc.getElementById(id) : null;
	},

	/**
	 * 根据节点名得到节点,参数:
	 * 
	 * @param {string}
	 *            tagName:节点名称
	 * @return {string} 指定节点名字的和位置的节点或节点数组。
	 */
	getNodesByTagName : function(tagName) {
		return tagName ? this.xmlDoc.getElementsByTagName(tagName) : null;
	},
	/**
	 * 根据节点路径返回第index个节点,参数:
	 * 
	 * @param {string}
	 *            xPath:节点路径
	 * @param {number}index:要索引的位置,为空或0则返回所有查找到的节点。
	 * @return {string} 指定节点名字的和位置的节点或节点数组。
	 */
	getNodesByXpath : function(xPath, index) {
		if (!xPath)
			return null;
		var nodes = this.xmlDoc.selectNodes(xPath);
		var len = nodes.length;
		if (!index || index > len || index < 0)
			return nodes;
		for ( var i = 0; i < len; i++) {
			if (i == index - 1)
				return nodes[i];
		}
	},
	/**
	 * 得到指定节点文本,参数:
	 * 
	 * @param {object}
	 *            node:节点
	 * @return {string} 节点文本,为空则返回null
	 */
	getText : function(node) {
		return node ? node.text : null;
	},
	/**
	 * 得到指定节点名称,参数:
	 * 
	 * @param {object}
	 *            node:节点
	 * @return {string} 节点名称,为空则返回null
	 */
	getTagName : function(node) {
		return node ? node.nodeName : null;
	},
	/**
	 * 返回节点类型,参数:
	 * 
	 * @param {object}
	 *            node:节点
	 * @return {string} 节点类型,为空则返回null 1-element 2-attribute 3-text 4-cdata
	 *         5-entity reference 6-entity 7-pi (processing instruction)
	 *         8-comment 9-document 10-document type 11-document fragment
	 *         12-notation
	 */
	getNodeType : function(node) {
		return node ? node.nodeType : null;
	},
	/**
	 * 创建节点,参数:
	 * 
	 * @param {string}
	 *            nodeName:节点名称,必填
	 * @param {string}
	 *            text:节点文本,可为空
	 * @param {Object}
	 *            attributes:属性值-JSON数组,可为空,例:{id:'id001',name:'name001'}
	 * @param {Object}
	 *            node:要增加子节点的节点,为空则返回新建的节点
	 * @param {Boolean}
	 *            cdata:是否生成带有CDATA区段的节点,true:生成,false:不生成
	 * @return {Object} 创建的节点,有异常则返回null
	 */
createNode : function(nodeName, text, attributes, node, cdata) {
		if (this.isIE) {
			// 创建子接点
	var childNode = this.xmlDoc.createElement(nodeName);
	// 创建文本节点
	var textNode = cdata == true ? this.xmlDoc.createCDATASection(text)
			: this.xmlDoc.createTextNode(text);
	childNode.appendChild(textNode);
	// 添加属性
	for ( var i in attributes) {
		this.createAttribute(childNode, i, attributes[i]);
	}
	;
	return node ? node.appendChild(childNode) : childNode;
} else {
	alert('火狐浏览器创建节点再说.');
	return null;
}
},
/**
 * 创建带CDATA区段的节点,参数:
 * 
 * @param {string}
 *            nodeName:节点名称,必填
 * @param {string}
 *            text:节点文本,可为空
 * @param {Object}
 *            attributes:属性值-JSON数组,可为空,例:{id:'id001',name:'name001'}
 * @param {Object}
 *            node:要增加子节点的节点,为空则返回新建的节点
 */
createCDATANode : function(nodeName, text, attributes, node) {
this.createNode(nodeName, text, attributes, node, true);
},
/**
 * 创建节点属性,参数:
 * 
 * @param {Object}
 *            node:节点,必填
 * @param {String}
 *            key:属性名,必填
 * @param {Object}
 *            value:属性值,必填
 * @param {Object}
 *            node:返回新增属性的节点
 * @return {Object} 增加属性的节点,有异常则返回null
 */
createAttribute : function(node, key, value) {
if (this.isIE) {
	if (!key)
		return;
	var attr = this.xmlDoc.createAttribute(key);
	attr.value = value ? value : "";
	node.setAttributeNode(attr);
	return node;
} else {
	alert('火狐浏览器创建节点再说.');
	return node;
}
return null;
},
/**
 * 把节点加到根节点上,参数:
 * 
 * @param {Object}
 *            node:节点
 * @return {Object} 有异常则返回null
 */
addNodeToRoot : function(node) {
if (!node)
	return null;
this.getRoot().appendChild(node);
return node;
},

/**
 * 把节点加到另外节点上,参数:
 * 
 * @param {Object}
 *            node:节点
 */
addNode : function(node, childNode) {
return (node && childNode) ? node.appendChild(childNode) : false;
},
/**
 * 把节点加到另外节点上,参数:
 * 
 * @param {Object}
 *            node:节点
 */
addNode : function(node, childNode) {
return (node && childNode) ? node.appendChild(childNode) : false;
},
/**
 * 从父节点移除节点自身,参数:
 * 
 * @param {Object}
 *            node:要移除的节点
 */
removeChild : function(node) {
if (!node || !node.parentNode)
	return;
node.parentNode.removeChild(node);
},
/**
 * 移除节点的所有子节点,参数:
 * 
 * @param {Object}
 *            node:父节点
 */
removeChildNodes : function(node) {
if (node && this.hasChildNodes(node)) {
	var childNodes = node.childNodes;
	for ( var i = 0; i < childNodes.length; i++) {
		node.removeChild(childNodes[0]);
	}
}
},
/**
 * 设置节点属性值,不存在则新建,参数:
 * 
 * @param {Object}
 *            node:要设置的节点
 * @param {String}
 *            key:要设置的属性名
 * @param {String}
 *            value:要设置的属性值
 */
setAttribute : function(node, key, value) {
this.createAttribute(node, key, value);
},
/**
 * 设置文本节点的文本,参数:
 * 
 * @param {Object}
 *            node:要设置的节点
 * @param {String}
 *            text:要设置的文本
 */
setText : function(node, text) {
if (this.isTextNode(node))
	node.text = text;
},
/**
 * 在文本节点后面追加文本,参数:
 * 
 * @param {Object}
 *            node:要设置的节点
 * @param {String}
 *            text:要设置的文本
 */
appendText : function(node, text) {
if (this.isTextNode(node))
	node.appendData(text);
},
/**
 * 输出xml,为空则输出根节点文本,参数:
 * 
 * @param {Object}
 *            node:要输出的节点
 */
toString : function(node) {
node = node ? node : this.xmlDoc.documentElement;
if (typeof node == 'string') {
	return node;
}
return this.isIE ? node.xml : new XMLSerializer().serializeToString(node);
}

};

 

 

测试 xml数据:

<?xml version="1.0" encoding="UTF-8"?>



<root> 

	<book> 
		<name>西游记</name> 
		<author>吴承恩</author> 
	</book> 
	
	
	<book> 
		<name>红楼梦</name> 
		<author>曹雪芹</author> 
	</book> 
	
	
	<book> 
		<name>三国演义</name> 
		<author>罗贯中</author> 
	</book>

	<book> 
		<name>水浒传</name> 
		<author>施耐庵</author> 
	</book> 
	
	
</root> 

 

 

测试jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>js解析XML文件</title>
</head>
<body>
	<div id="xmlOpTest">
		
	</div>
</body>

<script type="text/javascript" src="/js/XmlUtils.js"></script>

<script type="text/javascript">
	//config参数:xmlPath文件地址;dataType数据格式-json或arry,默认为array。 
	var xmlUtils = new XmlUtils({
			xmlPath:"/xmlData/book.xml",
			dataType:"xml"
		});

	//获取XML内容
	alert(xmlUtils.toString());
	var rs = xmlUtils.getNodesTextByName(['name','author']); 
	//把上面的dataType改为array或者不为json此处就能得到值
	document.getElementById("xmlOpTest").innerHTML += '<br/>取得所有的文本节点的数组: '+rs + '<br/>'; 
	var root = xmlUtils.getRoot(); 
	//alert(root);
	
	xmlUtils.createNode('publish', '中国电力出版社',{id:'id0001'},root); 
	xmlUtils.createCDATANode('publish', '中国&电力出版社',{},root); 

	//设置属性 
	xmlUtils.setAttribute(root,'testId','test'); 
	//修改属性 
	xmlUtils.setAttribute(root,'testId','test0000000000'); 
	alert(xmlUtils.toString(root)); 
	//删除第一个节点 publish
	xmlUtils.removeChild(xmlUtils.getNodesByXpath('//root/publish')[0]); 
	alert(xmlUtils.toString(root)); 

	var node = xmlUtils.getFirstChild(); 

	//+ xmlUtils.hasAttributes(node) +'<br/>';
	document.getElementById("xmlOpTest").innerHTML += '<br/>判断是否有子节点: '+ xmlUtils.hasChildNodes(node) + ' ------ 判断是否有属性:'; 

	document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +' ======== 节点类型:' + xmlUtils.getNodeType(node) + '<br/>'; 

	node = xmlUtils.getNextNode(node); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点下一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>'; 

	node = xmlUtils.getLastChild(); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>'; 


	node = xmlUtils.getPreviousNode(node); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个前一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>'; 

	node = xmlUtils.getParentNode(node); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的父节点: '+ xmlUtils.toString(node) +'<br/>'; 

	var nodes = xmlUtils.getChildNodes(); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的所有子节点: '+xmlUtils.toString(nodes)+'<br/>'; 

	node = xmlUtils.getNodesByXpath('//root/book/name',2); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node)+'<br/>'; 


	node = xmlUtils.getNodesByXpath('//root/book/author'); 
	document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值: '+xmlUtils.getTagName(node[0]) + "---" + xmlUtils.getText(node[0])+'<br/>'; 



	//得到修改后的文本节点 
	node = xmlUtils.getNodesByXpath('//root/publish',1); 
	node = xmlUtils.getFirstChild(node); 
	
	document.getElementById('xmlOpTest').innerHTML += '<br/>修改文本值前节点文本: '+xmlUtils.getText(node);
	 
	xmlUtils.setText(node,"西游记后传"); 
	document.getElementById('xmlOpTest').innerHTML += '-----修改文本值后节点文本: '+xmlUtils.getText(node); 
	xmlUtils.appendText(node,"之测试"); 
	
	document.getElementById('xmlOpTest').innerHTML += '-----追加文本值后节点文本: '+xmlUtils.getText(node) + "<br/>"; 

</script>
</html>

 



 

  • 大小: 201.7 KB
分享到:
评论

相关推荐

    JavaScript操作XML

    JavaScript,作为浏览器端的主要脚本语言,提供了处理XML的能力,使得动态地操作和解析XML数据成为可能。 在JavaScript中操作XML,通常涉及以下几个关键知识点: 1. **创建XML文档**:可以使用`document....

    javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码)

    javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) 测试数据: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt; &lt;book&gt; ...

    比较通用的xml解析方法

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、可扩展性和易于解析的特点广泛应用于Web服务、配置文件、数据交换等领域。本篇文章将详细探讨一种比较通用的XML解析方法,...

    xml解析与封装详解

    XML 解析与封装详解 XML(eXtensible Markup Language),即可扩展的标记性语言,是一种用于存储和传输数据的语言。XML 文件的所有标记都是可扩充的,不像 HTML 那样是固定的,而是由用户自行规定出来的。XML 的...

    Android 封装pull解析xml

    本篇文章将详细介绍如何在Android中封装一个基于Pull解析的XML处理工具,并演示如何直接调用这个工具进行XML解析。 Android支持两种主要的XML解析方式:DOM(Document Object Model)解析和SAX(Simple API for XML...

    如何用Document解析XML文件

    `DocumentBuilder`则负责实际的XML文件解析工作。 ```java // 创建DocumentBuilderFactory实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 使用工厂创建DocumentBuilder实例 ...

    Qt5.5 二次封装QDomDocument 实现xml更加方便的组装、解析

    自己根据CMarkup启发,使用QDomDocument完成类似CMarkup调用的xml组装解析实例,内测多次无问题,目前还有优化空间,我的环境是qt5.5,欢迎大家提出不同意见共同进步。 进入后可先点击解析再点击组装,本实例使用...

    解析XML文件(字符串)的两种方法

    - **解析XML字符串**:使用`read`方法,传入一个`ByteArrayInputStream`对象,该对象封装了待解析的XML字符串。这里将字符串转换为字节数组,然后创建一个字节输入流供`SAXReader`使用。 - **获取文档对象**:调用`...

    解析简单xml文件的类图设计1

    通过这样的设计,我们可以将XML文件解析的通用部分与具体业务逻辑分离,提高了代码的可复用性和可维护性。同时,利用接口和抽象类,我们能够灵活地扩展和定制XML解析行为,适应不同的项目需求。在实际应用中,可以...

    PB9解析xml(封装好的自定义对象,源码)

    标题中的“PB9解析xml”指的是使用PowerBuilder 9(简称PB9)这一编程工具来解析XML文件。PowerBuilder是一款可视化的、面向对象的开发工具,尤其在数据窗口设计方面有较强的优势。XML(eXtensible Markup Language...

    XML解析封装

    本文将深入探讨XML解析的原理与封装,以及如何在实际开发中高效地利用XML。 XML的结构与特点: 1. 结构化:XML基于树形结构,每个元素(Element)都可以包含其他元素或文本内容。 2. 自描述性:元素有明确的开始...

    基于XML的电子文件封装规范.doc

    基于XML的电子文件封装规范 概述: 基于XML的电子文件封装规范是档案行业标准,适用于档案管理软件的从业者,旨在指导业务开发。该标准规定了电子文件的封装结构和格式,以确保电子文件的可读性、可靠性和安全性。 ...

    NXopen二次开发将读取xml文件函数封装为dll方便调用

    本案例中,我们关注的是使用NXopen工具包进行的二次开发,目的是将读取XML文件的函数封装到一个动态链接库(DLL)中,以便于其他程序便捷地调用。下面将详细介绍这一过程及其相关知识点。 首先,我们需要了解XML...

    java 解析xml 多级

    而SAX解析器采用事件驱动的方式,逐行读取XML文件,适合处理大型XML文件以避免内存消耗。 对于多级XML,DOM解析更便于操作。以下是一个使用Java DOM解析XML的步骤: 1. 引入必要的库: 需要引入`javax.xml....

    Java解析Xml文件

    Java解析XML文件是一种常见的任务,尤其在处理结构化数据或者与服务器进行数据交换时。XML(eXtensible Markup Language)是一种标记语言,用于存储和传输数据,具有良好的可读性和可扩展性。在Java中,有多种方式来...

    java通用解析XML工具类

    本文将详细介绍如何创建一个Java通用的XML解析工具类,以便于在项目中复用和简化XML处理。 首先,我们来看DOM解析方式。DOM解析器会将整个XML文档加载到内存中,形成一棵树形结构,便于对XML进行随机访问。以下是一...

    XML通用解析工具类

    "XML通用解析工具类"通常会提供一套接口或方法,封装了上述解析方式,以简化开发者的代码编写。这类工具可能包括以下功能: 1. 解析XML文件:提供方法读取XML文件并将其解析为易于操作的数据结构。 2. 创建XML:...

    JAVA调用webservice并解析xml

    在IT行业中,调用Web服务并解析XML是常见的任务,特别是在Java开发中。Web服务,尤其是基于SOAP(Simple Object Access Protocol)的,提供了一种标准的跨平台、跨语言的数据交换方式。本教程将深入讲解如何在Java...

    一次代码重构之旅-快速读写xml文件工具类封装

    在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...

    XMLParser(XML解析代码 C++版)

    XMLParser可能是一个封装了TinyXML或其他XML解析库的自定义类,它可能提供了更高级别的接口,使得与XML数据交互更加直观。例如,它可能会有如下的API: - `parseFile(const std::string& filePath)`: 加载并解析XML...

Global site tag (gtag.js) - Google Analytics