`
jseed
  • 浏览: 7660 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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表示当updatedelete该字段为操作的 where 条件

XML1

要求:

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

l        和前端的接口,接受前端程序提交的XMLXML1)。

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写个小界面就可以啦

    

分享到:
评论

相关推荐

    SQL SERVER实用教程 T-SQL语言.pdf

    ### SQL SERVER实用教程 T-SQL语言 #### 一、SQL语言概述 1. **SQL语言简介**: - **名称**:SQL(Structured Query Language),即结构化查询语言。 - **起源与发展**:最初由IBM公司开发并在其数据库系统中...

    毕业设计--基于某公司的招聘系统

    【标题】"毕业设计--基于某公司的招聘系统"是一个典型的Web应用开发项目,它利用了Spring Boot、Spring MVC、MyBatis以及Shiro这四个关键的技术栈。这个系统旨在为某公司提供一个全面的在线招聘解决方案,使得招聘...

    某公司门户网站

    【某公司门户网站】是一个基于JavaWeb技术构建的网站应用,主要采用了Struts2和Hibernate3两个框架进行集成开发。这两个框架在JavaWeb开发领域中占据了重要地位,它们为开发者提供了强大的功能,使得创建高效、可...

    某公司Java面试试题

    2. 关键字:Java的关键字是被语言保留的标识符,不能用作变量名、方法名等。题目中的 `null`, `true`, `main`, `extends` 是Java关键字,而 `NULL`, `instansof`, `sizeof` 不是。 3. 异常处理:在Java中,异常处理...

    某公司的iBATIS培训文档

    它允许开发者编写定制的SQL,通过XML或注解形式的映射配置,将SQL与Java对象(POJOs)关联起来。这样,开发者可以专注于业务逻辑,同时自由地控制数据库交互。 【iBATIS的准备工作】 要开始使用iBATIS,首先需要...

    graduate:毕业设计--基于某公司的招聘系统

    【标题】"graduate:毕业设计--基于某公司的招聘系统"是一个综合性的项目,它利用了Java后端技术栈来构建一个完整的招聘管理平台。这个系统旨在帮助公司更有效地进行人才招聘,提供便捷的岗位发布、简历筛选、面试...

    学习笔记:DB2+9+基础.pdf

    DB2是IBM公司推出的一款关系型数据库管理系统,广泛应用于各类企业级应用环境中。本文档主要介绍了DB2的几个重要版本及其特点。 ##### 1. DB2产品版本 - **DB2 Everyplace**:针对移动设备设计,支持多种移动操作...

    高校科研管理系统ASP.NET+C#+sql 2000实现

    首先,ASP.NET是微软公司推出的一种Web应用程序框架,它基于.NET Framework,为开发者提供了构建动态网站、Web应用和服务的强大工具。ASP.NET支持多种编程模型,如ASP.NET Web Forms、ASP.NET MVC和ASP.NET Core,本...

    net学习笔记及其他代码应用

    解2: select top 10 * from A where id &gt; (select max(id) from (select top 30 id from A )as A) 34.面向对象的语言具有________性、_________性、________性 答:封装、继承、多态。 35.能用foreach遍历访问的...

    Jsp标签库帮助文档

    JSTL是SUN公司定义的JSP标准标签库,它源于Apache Jakarta小组对常见WEB应用问题的总结和解决方案。JSTL的出现是为了消除不同厂商自定义标签之间的混乱,提供一套通用、标准化的标签集,使得开发者能够在不同的WEB...

    C#SQL数据表提取器

    C#是微软公司开发的一种面向对象的编程语言,它以其强大的.NET框架为基础,广泛应用于各种软件开发,尤其是Windows平台的应用。在C#中处理SQL数据库,通常会利用ADO.NET库,这使得C#与SQL Server等数据库系统之间的...

    JAVA—sql 笔试常见题

    J2EE(Java 2 Platform, Enterprise Edition)是 Sun Microsystems 公司推出的一套多层分布式企业应用模型标准,主要用于构建大规模、分布式的企业级应用系统。 - **多层结构**:J2EE 支持多层架构设计,允许开发者...

    SSM学习资料

    MyBatis允许开发者编写SQL语句,通过XML或注解的方式将SQL与Java代码绑定,从而避免了传统的JDBC代码的繁琐。它支持动态SQL,可以更灵活地处理复杂查询,同时提供了一种方便的映射机制,将数据库查询结果自动转化为...

    湖南省技能抽查习题答案.zip

    3. **Android应用开发**:Android Studio的使用、Activity和Fragment的管理、Intent传递、布局设计(XML与编程动态创建)、数据持久化(SQLite数据库、SharedPreferences、文件存储)、网络请求(如Retrofit、Volley...

    SQL Server 2005 系列课程-

    SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理、分析和报告方面扮演着重要角色。本系列课程将深入探讨SQL Server 2005的各项核心功能和特性,旨在帮助学习者掌握该系统的使用和优化...

    怎么在oracle10g查询所有包含某字段的表名.doc

    Oracle 10g数据库系统是Oracle公司发布的一个版本,提供了丰富的功能和强大的性能。在数据库管理中,有时候我们需要查找所有包含特定字段的表,这对于数据治理、数据分析或优化查询性能非常有帮助。以下是如何在...

    某移动公司清单查询系统(c#,vs2008,sql2008开发,开源)

    该移动公司清单查询系统是一个基于C#编程语言,利用Visual Studio 2008 IDE以及SQL Server 2008数据库进行开发的应用程序。开源性质意味着源代码是公开的,开发者可以自由查看、学习和修改代码,这对于初学者或者...

Global site tag (gtag.js) - Google Analytics