微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML解析与XML拼接

2015年了。

1、XML解析

这边是用的dom4j方式解析。

解析的XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<DBSET>
	<R>
		<C N="TASKID">10001</C> <!-- TASKID -->
		<C N="TYPE">D</C><!-- 查询类型(D/U) -->
	</R>
	<R>
		<C N="TASKID">10002</C> <!-- TASKID -->
		<C N="TYPE">U</C><!-- 查询类型 (D/U) -->
	</R>
</DBSET>

解析XML代码如下:

	/**
	 * @category 解析传入XMl
	 * @param xmldata
	 * @return List<Map<String,String>>
	 */
	@SuppressWarnings("unchecked")
	public static List<Map<String,String>> xmlData(String xmldata) {
		List<Map<String,String>> lists = new ArrayList<Map<String,String>>();
		Document doc = null;
		Map<String,String> map = null;
		try {
			doc = DocumentHelper.parseText(xmldata);
		} catch (Exception e) {
			map = new HashMap<String,String>();
			map.put(FAIL_MEMO,"错误的xml格式数据");
			lists.add(map);
			return lists;
		}
		try {
			Element root = doc.getRootElement();
			//根元素(DBSET)迭代器
			Iterator<Element> iter = root.elementIterator();
			//解析里面XML
			while (iter.hasNext()) {
				map = new HashMap<String,String>();
				Element cns = (Element) iter.next();
				//R元素迭代器
				Iterator<Element> its = cns.elementIterator();

				while (its.hasNext()) {
					Element cn = (Element) its.next();
					//将C元素的属性名和文本值存入Map中
					map.put(cn.attribute(NAME).getValue(),cn.getText());
				}
				lists.add(map);
			}
		} catch (Exception e) {
			map.put("FAIL_MEMO","错误的xml格式");
			lists.add(map);
		}
		return lists;
	}

最后存入List<Map<String,String>>中的值为:
[{TASKID=10001,TYPE=D},{TASKID=10002,TYPE=U}]


2、XML拼接

采用自定义类以及对应工具类的方式,具体代码如下:(感谢tangyangbo)

自定义类:

package com.keyman.struts2.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Title: Element.java
 * @Package com.keyman.struts2.test
 * @Description: Todo XML元素类
 * @author tangyangbo
 * @date 2014-12-11 下午5:32:45
 * @version V1.0
 */
public class Element {
	private String name; // 元素名
	private String nodeText = ""; // 文本值
	private Map<String,String> property = new HashMap<String,String>(); // 属性
	private boolean isleaf = true; // 是否子节点
	private List<Element> child = new ArrayList<Element>(); // 子节点

	public Element(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNodeText() {
		return nodeText;
	}

	public void setNodeText(String nodeText) {
		this.nodeText = nodeText;
	}

	public Map<String,String> getproperty() {
		return property;
	}

	public void setProperty(Map<String,String> property) {
		this.property = property;
	}

	public boolean isIsleaf() {
		return isleaf;
	}

	// 这个方法应该屏蔽
	public void setIsleaf(boolean isleaf) {
		this.isleaf = isleaf;
	}

	public List<Element> getChild() {
		return child;
	}

	public void setChild(List<Element> child) {
		this.child = child;
		if (this.isleaf && this.child.size() > 0) {
			this.isleaf = false;
		}
	}

	/**
	 * 添加属性
	 * 
	 * @param key
	 * @param value
	 */
	public void addProperty(String key,String value) {
		this.property.put(key,value);
	}

	/**
	 * 添加子节点
	 * 
	 * @param el
	 */
	public void addChild(Element el) {
		this.child.add(el);
		if (this.isleaf && this.child.size() > 0) {
			this.isleaf = false;
		}
	}
}

工具类:

package com.keyman.struts2.test;

import java.util.Iterator;

/**
 * @Title: XmlUtil.java
 * @Package com.keyman.struts2.test
 * @Description: Todo XMl工具类
 * @author <span><span class="comment">tangyangbo</span> </span>
 * @date 2014-12-11 下午5:34:02
 * @version V1.0
 */
public class XmlUtil {

	public static String lt = "<";
	public static String ltEnd = "</";
	public static String rt = ">";
	public static String rhtEnd = "/>";
	public static String quotes = "\"";
	public static String equal = "=";
	public static String blank = " ";

	/**
	 * @category 拼接XML各元素信息
	 * @param element
	 * @return
	 */
	public static StringBuffer elementToXml(Element element) {
		StringBuffer result = new StringBuffer();
		// 元素开始
		result.append(lt).append(element.getName());
		// 判断是否有属性
		if (element.getproperty() != null && element.getproperty().size() > 0) {
			Iterator<String> iter = element.getproperty().keySet().iterator();
			while (iter.hasNext()) {
				String key = String.valueOf(iter.next());
				String value = element.getproperty().get(key);
				result.append(blank).append(key).append(equal).append(quotes)
						.append(value).append(quotes).append(blank);
			}
		}
		result.append(rt);// 结束标记
		/*
		 * 判断是否是叶子节点 是叶子节点,添加节点内容 不是叶子节点,循环添加子节点
		 */
		if (element.isIsleaf()) {
			result.append(element.getNodeText());
		} else {
			for (Element temp : element.getChild()) {
				result.append(elementToXml(temp));
			}
		}
		// 元素结束
		result.append(ltEnd).append(element.getName()).append(rt);
		return result;
	}

	/**
	 * @category 拼接XML申明信息
	 * @param element
	 * @return
	 */
	public static String element2Xml(Element element) {

		StringBuffer body = elementToXml(element);
		StringBuffer head = new StringBuffer(
				"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		head.append(body);
		return head.toString();
	}

}

XML拼接测试代码如下:
package com.keyman.struts2.test;

/**
 * @Title: XmlTest.java
 * @Package com.keyman.struts2.test
 * @Description: Todo xml测试类
 * @author <span><span class="comment">tangyangbo</span> </span>
 * @date 2014-12-11 下午5:36:29
 * @version V1.0
 */
public class XMLTest {
	public static void main(String[] args) {
		/**
		 * <?xml version="1.0" encoding="UTF-8"?> 
		 * <DBSET> 
		 * <R> 
		 * <C N="FLAG">0</C><!-- 执行情况-1/0 --> 
		 * <C N="RETURNMESSAGE">message</C><!-- 返回消息 --> 
		 * </R>
		 * </DBSET>
		 */
		Element dbsetElement = new Element("DBSET");

		Element rElement = new Element("R");

		Element cElement1 = new Element("C");
		cElement1.addProperty("N","FLAG");
		cElement1.setNodeText("0");

		Element cElement2 = new Element("C");
		cElement2.addProperty("N","RETURNMESSAGE");
		cElement2.setNodeText("message");

		rElement.addChild(cElement1);
		rElement.addChild(cElement2);
		dbsetElement.addChild(rElement);

		System.out.println(XmlUtil.element2Xml(dbsetElement));
	}
}

输出代码如下:
<?xml version="1.0" encoding="UTF-8"?><DBSET><R><C N="FLAG" >0</C><C N="RETURNMESSAGE" >message</C></R></DBSET>

参考资料: http://tyb.iteye.com/blog/1792013

原文地址:https://www.jb51.cc/xml/297426.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。