XML应用:XML2SQL(某公司招聘试题)

**** 开发人员测试题  

感谢参加**软件有限公司程序编写能力考试,请按照本文档要求编写相关的应用程序,并在5个工作日内将程序源代码、编译结果、相关文档(如果有)发送到 hr@***soft.net(*小姐)收。

试题编码

PKUHRTS012

测试内容

J2EE开发人员

标准时间

5个工作日

  
 

1        基本要求

(一)            请编写JAVA代码实现本文档所要求的功能

(二)            本测试侧重考察JAVA中间应用程序编写能力,要求编写的JAVA组件可以成功部署到J2EE应用服务器上(TOMCAT,WEBLOGIC等)

(三)            为考察接口调用及结果考察,要求编写简单的前端应用(客户端、页面均可),调用编写的JAVA组件

2        功能要求

说明:在我们的应用程序编写中,所有的业务操作均通过XML标志实现前端和中间应用服务器的接口,如下示例:

 

<?xml version="1.0"?>

<PKUDOC pkusoft="urn=schemas-pkusoft-com:fz" version="2.0">

   <DATAINFO>

       <TABLE name="PERSON" operation="0">

          <ID state="0">00003</ID>

          <NAME state="0">刘军</NAME>

       </TABLE>

       <TABLE name="PERSON" operation="1">

          <ID  state="5">00001</ID>

          <NAME state="0">张惠</NAME>

       </TABLE>

       <TABLE name="PERSON" operation="2">

          <ID state="5">00002</ID>

       </TABLE>

   </DATAINFO>

</PKUDOC>

 

说明:TABLE节点:表示要进行操作的数据库表名称,name属性为要操作的表的数据库名称,其子节点的节点名为要处理的字段名,子节点的值为字段的值

      Operation 属性:表示要进行的数据库操作,0表示insert操作;1表示update操作;2表示delete操作

       State     属性:0表示普通操作类型;5表示当update和delete该字段为操作的 where 条件

(XML1)

要求:

请按照上述的XML,编写一个JAVA组件,实现如下功能:

l        和前端的接口,接受前端程序提交的XML(XML1)。

l        解析XML,并依据XML的节点信息进行业务处理

l        业务处理包括三个内容:

n        增加一条新记录“刘军”,人员编号为“00003”

n        修改人员编号为“00001”的人员名字为“张惠”

n        删除编号问“00002”的人员

l        以上业务操作在同一事务中

l        业务处理只要求生成SQL语句,SQL可以生成文件或者显示在前端界面上。

 

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
 * xml操作工具类
 * readStrToXML(String strXML) 把字符串转为xml文档
 * readFile(String fileName) 读取xml文件
 * getTheElementList(Element element,String elementName)   遍历XML文档,得到指定的元素集合
 * parse2SQL(Element element)  解析一个的元素根据协议生成sql语句
 * @author jseed
 **/
public class XMLTools {
	// 测试方法
	public static void main(String[] args) {
		List list=getTheElementList(readStrToXML(getXML()).getRootElement(),"TABLE"); 
		for (int i = 0; i < list.size(); i++) {
			org.dom4j.Element ele = (Element) list.get(i);
			parse2SQL(ele);
		}

	}
	
	/**
	 * 把字符串转为xml文档
	 * @param strXML:字符串
	 * @return Document
	 */
	public static Document readStrToXML(String strXML) {	
		try {
			InputStream fl=new ByteArrayInputStream(strXML.getBytes("UTF-8"));
			SAXReader reader = new SAXReader();
			
			Document document = reader.read(fl);
			System.out.println("读取XML成功");
			return document;
		} catch (Exception ep) {
			ep.printStackTrace();
			return null;
		}
	}

	/**
	 * 读取xml文件
	 * @param fileName:文件名
	 * @return Document
	 */
	public static Document readFile(String fileName) {
		File fl = new File(fileName);
		try {
			SAXReader reader = new SAXReader();
			Document document = reader.read(fl);
			System.out.println("读取XML成功");
			return document;
		} catch (Exception ep) {
			ep.printStackTrace();
			return null;
		}
	}

	/**
	 * 遍历XML文档,得到指定的元素集合
	 * @param rootElement: 根元素
	 * @param elementName:指定元素名
	 * @return:指定元素名的元素集合
	 */
	public static List<org.dom4j.Element> getTheElementList(Element rootElement,String elementName){
		nodeList.clear();
		treeWalk(rootElement, elementName);
		return nodeList;
	}
		
	/**
	 * 遍历XML文档,得到指定的元素
	 * @param element 元素
	 */
	private static void treeWalk(Element element,String elementName) {

		for (int i = 0; i < element.nodeCount(); i++) {
			Node node = element.node(i);
			// 如果节点为一个元素 一个节点可以为以下三种类型
			// 1元素(Element)
			// 2文字(text 空行也算)
			// 3注解(Comment)
			if (node instanceof Element) {
				String nodeName = node.getName();
				// 如果节点名字为table就加入到nodeList中
				if (nodeName.equals(elementName)) {
					nodeList.add((Element)node);
				}
				// 递归
				treeWalk((Element) node,elementName);
			} else {

			}
		}
	}
	

	/**
	 * 解析一个的元素
	 * 
	 * @param element :一个table元素
	 * @return:根据协议生成一条SQL语句
	 */
	public static String parse2SQL(Element element) {
		String sql = null;
		String insertField = null;
		String insertValue = null;
		String updateField = null;
		String condition = null;
		// 得到表名
		String tableName = element.attributeValue("name");
		// 得到操作类型
		String operation = element.attributeValue("operation");

		// 考虑到可能没有NAME元素 使用list的方式获得名,值
		List<org.dom4j.Element> eleList = element.elements();
		if (eleList.isEmpty()) {
			return null;
		}

		java.util.Map<String, String> fieldMap = new java.util.HashMap<String, String>();
		for (int i = 0; i < eleList.size(); i++) {
			// 得到元素的名字
			String eleName = eleList.get(i).getName();
			// 元素的text
			String eleTest = eleList.get(i).getText();

			// 得到元素的state的属性的值
			String eleAttribute = eleList.get(i).attributeValue("state");

			if (eleAttribute.equals("0")) {
				// 把用于普通操作的字段放入map
				fieldMap.put(eleName, eleTest);
			} else if (eleAttribute.equals("5")) {
				// 得到条件
				condition = eleName + "=" + eleTest;
			}

		}

		// 迭代map
		Iterator<String> it = fieldMap.keySet().iterator();

		// 根据协议生成具体SQL
		switch (Integer.valueOf(operation)) {
		case 0:

			while (it.hasNext()) {
				String key = it.next();
				insertField = key + "," + insertField;
				insertValue = fieldMap.get(key) + "," + insertValue;
			}
			// 截取最后的一个逗号
			insertField = insertField
					.substring(0, insertField.lastIndexOf(","));
			insertValue = insertValue
					.substring(0, insertValue.lastIndexOf(","));

			sql = "INSERT INTO " + tableName + "(" + insertField + ") VALUES ("
					+ insertValue + ")";
			break;
		case 1:
			while (it.hasNext()) {
				String key = it.next();
				updateField = key + "=" + fieldMap.get(key) + "," + updateField;
			}
			// 截取最后的一个逗号
			updateField = updateField
					.substring(0, updateField.lastIndexOf(","));

			if (null == condition) {
				sql = "UPDATE " + tableName + "  SET (" + updateField + ")";
			} else {

				sql = "UPDATE " + tableName + "  SET (" + updateField
						+ ") WHERE " + condition;
			}
			break;
		case 2:
			if (null == condition) {
				sql = "DELETE FROM " + tableName;
			} else {
				sql = "DELETE FROM " + tableName + " WHERE " + condition;
			}
			break;
		default:
			sql = "";
			break;
		}
        //测试
		System.out.println("-----------" + "SQL: " + sql);
		return sql;
	}
    
	
	
	//测试用方法
	public static String getXML() {
		String xml = "<?xml version=\"1.0\"?>"
				+ "<PKUDOC pkusoft=\"urn=schemas-pkusoft-com:fz\" version=\"2.0\">"
				+ "	<DATAINFO>" + "	<TABLE name=\"PERSON\" operation=\"0\">"
				+ "	<ID state=\"0\">00003</ID>"
				+ "	<NAME state=\"0\">刘小小</NAME>" + "</TABLE>"
				+ "	<TABLE name=\"PERSON\" operation=\"1\">"
				+ "	<ID  state=\"5\">00001</ID>"
				+ "	<NAME state=\"0\">张惠</NAME>" + "</TABLE>"
				+ "	<TABLE name=\"PERSON\" operation=\"2\">"
				+ "	<ID state=\"5\">00002</ID>" + "</TABLE>"
				+ "	</DATAINFO>" + " </PKUDOC>";
		return xml;
	}




	// Element容器
	private static java.util.List<org.dom4j.Element> nodeList = new java.util.ArrayList<org.dom4j.Element>();

}

 

 

    有了这个工具类,就可以把XML 按照文档的协议转成SQL
但是根据文档的要求 还需要部署到web容器上,需要一个客户端
我的思路是做一个web service,客户端用swing写个小界面就可以啦

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值