500分:急求如何通过jsp或servlet读取data.xml生成一个插入(insert)的sql语句打印出来。

zhangsq 2003-08-22 05:41:38
data.xml文件如下:其中user和group和dept为表名,其余为该表的字段
<?xml version="1.0" encoding="GB2312"?>
<matter>
<user>
<userid>001</userid>
<username>zhangxj</username>
<password>123456</password>
<email>zsq666@263.net</email>
<userstatus>1</userstatus>
  <groupid>1</groupid>
  <deptid>1</deptid>
</user>
<group>
<groupid>1</groupid>
<groupname>项目一组</groupname>
<grouper>王岗</grouper>
<groupdesc>网络软件开发</groupdesc>
</group>
<group>
<groupid>2</groupid>
<groupname>项目二组</groupname>
<grouper>刘武</grouper>
<groupdesc>医疗软件的开发</groupdesc>
</group>
<group>
<groupid>2</groupid>
<groupname>项目三组</groupname>
<grouper>李奋</grouper>
<groupdesc>软件的测试维护</groupdesc>
</group>
<dept>
<deptid>1</deptid>
<deptname>软件部</deptname>
<depter>张则</depter>
<number>20</number>
<desc>it事业部</desc>
</dept>
</matter>
...全文
134 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunboy666 2003-08-23
  • 打赏
  • 举报
回复
学习
ejbcreate 2003-08-23
  • 打赏
  • 举报
回复
To cust(wanda) :是的,我本来是想用一个递归来取数据。不过,限于时间问题,只写了这个来代替了。

To whodsow(whodsow) :用XPath? 我用它来把XML转换为HTML来在浏览器显示。请问可以把你写的代码贴出来么?让我学习一下。多谢先。
wueg2003 2003-08-23
  • 打赏
  • 举报
回复
通过dom解析器把xml文档读取出来,(详见xml帮助文档微软网站有下载)然后再通过insert语句插入
whodsow 2003-08-23
  • 打赏
  • 举报
回复
呵呵,用XPath,结构简单明确,代码简洁,一级棒。
gboy2003 2003-08-23
  • 打赏
  • 举报
回复
up
cust 2003-08-23
  • 打赏
  • 举报
回复
to ejbcreate() :知道xml文件的层次机构以后,不要手工的去处理每个标签,直接用程序读出来扩展性会好一些。我的程序里面其实有有漏洞的,不过主要目的是为了给楼主演示。
ejbcreate 2003-08-23
  • 打赏
  • 举报
回复
还有,我的程序中有很多地方需要做一些判断的,现在都没有做,很遗憾。
ejbcreate 2003-08-23
  • 打赏
  • 举报
回复
比cust(wanda)兄的长了很多(但输出结果是一样的),可能是我的算法不够好,
自己感觉有好多地方写得很混乱,本来想写成递归的,这样可扩展性好很多,程序也会精悍许多,但时间关系,现在只能做到这一步。//呵呵。

我已经测试过,在我的环境下可以运行的了。


ejbcreate 2003-08-23
  • 打赏
  • 举报
回复
/*
Author: ejbcreate
*/
import java.io.*;
import java.util.Vector;
import org.w3c.dom.*;
import org.xml.sax.*;
import org.apache.xerces.parsers.DOMParser;

public class DealXml
{
public static void main(String[] args)
{
String lFilePath = "C:\\DealXml\\data.xml";
try
{
DealXml lDealXml = new DealXml();
InputSource lInSource = lDealXml.readXmlFile(lFilePath);
System.out.println("lInSource = "+lInSource);
Vector lVect = lDealXml.processXML(lInSource);
System.out.println("lVect.size() = "+lVect.size());
Vector lSqlVect = lDealXml.generateSql(lVect);
System.out.println("lSqlVect.size() = "+lSqlVect.size());
for(int i=0; i<lSqlVect.size(); i++)
{
System.out.println("SqlStr_"+i+" = "+lSqlVect.elementAt(i));
}
}
catch(Exception ex)
{
System.out.println("main() Excpt: "+ex.toString());
}
}

public InputSource readXmlFile(String rFilePath) throws IOException
{
File lFile = null;
InputSource lInSource = null;
InputStream lInStream = null;
try
{
if(rFilePath == null && rFilePath.equals(""))
return lInSource;
//lFile = new File(rFilePath);
//lInStream = new FileInputStream(lFile);
lInStream = new FileInputStream(rFilePath);
lInSource = new InputSource(lInStream);
//lInStream.close();
}
catch(Exception ex)
{
System.out.println("Excpt: "+ex.toString());
if(lInStream != null)
lInStream.close();
}
return lInSource;
}

//※※功能说明:返回一个由XML包拆分的Vector,其中Vector里装着二维数组。
public Vector processXML(InputSource rIS)
{
Vector lVect = null;
String[][] lArrayValue = null;
try{
if(rIS == null)
return lVect;
DOMParser lDB = new DOMParser();

lDB.parse(rIS);

Document lDoc = lDB.getDocument();
//Element lRoot = lDoc.getDocumentElement();
lVect = new Vector();

NodeList lUserNodeList = lDoc.getElementsByTagName("user");
int lUserNodeCounts = lUserNodeList.getLength();
for(int i=0; i<lUserNodeCounts; i++)
{
NodeList lUserChildNodeList = ((Node)lUserNodeList.item(i)).getChildNodes();
int lUserChildCounts = lUserChildNodeList.getLength();
Vector lElemNodeVect = new Vector();
for(int k=0; k<lUserChildCounts; k++)
{
if(lUserChildNodeList.item(k).getNodeType() == Node.ELEMENT_NODE)
{
lElemNodeVect.add((Node)lUserChildNodeList.item(k));
}
}
lArrayValue = new String[lElemNodeVect.size()+1][2];
lArrayValue[0][0] = "table";
lArrayValue[0][1] = "user";

for(int j=0; j<lElemNodeVect.size(); j++)
{
String lName = ((Node)lElemNodeVect.elementAt(j)).getNodeName();
String lValue = ((Node)lElemNodeVect.elementAt(j)).getFirstChild().getNodeValue();
System.out.println("lValue = "+lName);
System.out.println("lValue = "+lValue);

lArrayValue[j+1][0] = lName;
lArrayValue[j+1][1] = lValue;
}
lVect.add(lArrayValue);
}

NodeList lGroupNodeList = lDoc.getElementsByTagName("group");
int lGroupNodeCounts = lGroupNodeList.getLength();
for(int i=0; i<lGroupNodeCounts; i++)
{
NodeList lGroupChildNodeList = ((Node)lGroupNodeList.item(i)).getChildNodes();
int lGroupChildCounts = lGroupChildNodeList.getLength();
Vector lElemNodeVect = new Vector();
for(int k=0; k<lGroupChildCounts; k++)
{
if(lGroupChildNodeList.item(k).getNodeType() == Node.ELEMENT_NODE)
{
lElemNodeVect.add((Node)lGroupChildNodeList.item(k));
}
}
lArrayValue = new String[lElemNodeVect.size()+1][2];
lArrayValue[0][0] = "table";
lArrayValue[0][1] = "group";

for(int j=0; j<lElemNodeVect.size(); j++)
{
String lName = ((Node)lElemNodeVect.elementAt(j)).getNodeName();
String lValue = ((Node)lElemNodeVect.elementAt(j)).hasChildNodes() == true?((Node)lElemNodeVect.elementAt(j)).getFirstChild().getNodeValue():"";
System.out.println("lValue = "+lName);
System.out.println("lValue = "+lValue);

lArrayValue[j+1][0] = lName;
lArrayValue[j+1][1] = lValue;
}
lVect.add(lArrayValue);
}

NodeList lDeptNodeList = lDoc.getElementsByTagName("dept");
int lDeptNodeCounts = lDeptNodeList.getLength();
for(int i=0; i<lDeptNodeCounts; i++)
{
NodeList lDeptChildNodeList = ((Node)lDeptNodeList.item(i)).getChildNodes();
int lDeptChildCounts = lDeptChildNodeList.getLength();
Vector lElemNodeVect = new Vector();
for(int k=0; k<lDeptChildCounts; k++)
{
if(lDeptChildNodeList.item(k).getNodeType() == Node.ELEMENT_NODE)
{
lElemNodeVect.add((Node)lDeptChildNodeList.item(k));
}
}
lArrayValue = new String[lElemNodeVect.size()+1][2];
lArrayValue[0][0] = "table";
lArrayValue[0][1] = "dept";

for(int j=0; j<lElemNodeVect.size(); j++)
{
String lName = ((Node)lElemNodeVect.elementAt(j)).getNodeName();
String lValue = ((Node)lElemNodeVect.elementAt(j)).hasChildNodes() == true?((Node)lElemNodeVect.elementAt(j)).getFirstChild().getNodeValue():"";
System.out.println("lValue = "+lName);
System.out.println("lValue = "+lValue);

lArrayValue[j+1][0] = lName;
lArrayValue[j+1][1] = lValue;
}
lVect.add(lArrayValue);
}


}
catch (Exception ex) {
System.out.println("错误时间:"+new java.util.Date());
System.out.println("错误代码:"+ex.getMessage());
}
return lVect;
}

public Vector generateSql(Vector rVector)
{
Vector lSqlStrVect = null;
//StringBuffer lSB = null;
try
{
if(rVector == null) return lSqlStrVect;
lSqlStrVect = new Vector();
for(int i=0; i<rVector.size(); i++)
{
//lSB = new StringBuffer("insert into ");
String lSqlStr = "insert into ";
String lFieldName ="";
String lValues ="";
String[][] lArray = (String[][])rVector.elementAt(i);
lSqlStr += lArray[0][1];
for(int j=1; j<lArray.length; j++)
{
lFieldName += lArray[j][0] + ",";
lValues += "'"+lArray[j][1] + "',";
}
if(lFieldName != null && !lFieldName.equals(""))
lFieldName = lFieldName.substring(0, lFieldName.length()-1);
if(lValues != null && !lValues.equals(""))
lValues = lValues.substring(0, lValues.length()-1);
lSqlStr += "("+lFieldName+")"+" values("+lValues+")";
System.out.println("lSqlStr_"+i+" = "+lSqlStr);
lSqlStrVect.addElement(lSqlStr);
}
}
catch(Exception ex)
{
System.out.println("Excpt: "+ex.toString());
}
return lSqlStrVect;
}
}
cust 2003-08-23
  • 打赏
  • 举报
回复
你还有其他的理解??
该程序的输出是结果是
insert into user(userid,username,password,email,userstatus,groupid,deptid)values('001','zhangxj','123456','zsq666@263.net','1','1','1')

insert into group(groupid,groupname,grouper,groupdesc)values('1','项目一组','王岗','网络软件开发')

insert into group(groupid,groupname,grouper,groupdesc)values('2','项目二组','刘武','医疗软件的开发')

insert into group(groupid,groupname,grouper,groupdesc)values('2','项目三组','李奋','软件的测试维护')

insert into dept(deptid,deptname,depter,number,desc)values('1','软件部','张则','20','it事业部')
whodsow 2003-08-23
  • 打赏
  • 举报
回复
楼上的老兄,他说的好像不是这么回事哟。
cust 2003-08-23
  • 打赏
  • 举报
回复
需要注意的是,如果xml文件中的字段值为空,或者含有单引号,则你需要自己处理一下。前者可能引发对象为空的异常,后者输出的sql语句就会出现错误,如字段名为col1,字段值为a',现在的程序生成的语句是insert into table1(col1) values('a''),但是我们需要把含有单引号的内容替换成insert into table1(col1) values('a''')
cust 2003-08-22
  • 打赏
  • 举报
回复
程序如下,其中没有考虑到字段的数据类型,都是按照字符串处理的,如果有其他如日期等数据类型,则应该在xml中添加字段类型属性。其中需要jdom包,可以在网上下载。或者直接在jbuilder中引入。我是在jbuilder7中调试通过的。
package test;
import org.jdom.*;
import org.jdom.input.*;
import java.io.*;
import java.util.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
/**
* 思路:对二级节点进行便利,然后把每一个元素作为
*
* */
public class Haha {

public Haha() {
}
public static void main(String args[]){
try {
SAXBuilder saxb = new SAXBuilder();
//从文件构造一个Document,因为XML文件中已经指定了编码,所以这里不必了
Document doc = saxb.build(new FileInputStream("data.xml"));
Element root = doc.getRootElement(); //得到根元素
//得到子元素的个数,也就是要处理count条sql语句
int layer1Count = root.getChildren().size();

List elements = root.getChildren(); //得到根元素所有子元素的集合
Element firstElement;
StringBuffer sb = new StringBuffer(); //用来保存sql语句的前半部分
for (int i = 0; i < layer1Count; i++) {
firstElement =(Element)elements.get(i);
// System.out.println(firstElement.getName()) ;//打印出表的名字
int layer2Count = firstElement.getChildren().size();
StringBuffer value = new StringBuffer();
Element secondElement;
sb.append("insert into "+ firstElement.getName() + "(");
value.append("values(");
for (int j = 0; j < layer2Count; j++) {
secondElement = (Element)firstElement.getChildren().get(j);
sb.append(secondElement.getName()+",");
value.append("'"+secondElement.getText()+"',");
}
sb.deleteCharAt(sb.length()-1); //删除多余的","
value.deleteCharAt(value.length()-1); //删除多余的","
sb.append(")");
value.append(")");
System.out.println(sb.toString()+value.toString());
sb.delete(0,sb.length());
value.delete(0,value.length());
}
}
catch (Exception ex) {
ex.printStackTrace();
}

}
}
xiaogangliang 2003-08-22
  • 打赏
  • 举报
回复
up!
cust 2003-08-22
  • 打赏
  • 举报
回复
首先你需要一个使用一个dom解析器,现在常用的是jdom ,这个解析器使用起来简单方便。
我一会把代码贴出来。
whodsow 2003-08-22
  • 打赏
  • 举报
回复
老兄,你的问题不难,但我得明白你的意思嘛,说句话塞。
whodsow 2003-08-22
  • 打赏
  • 举报
回复
“然后相成相应的insert into user(、、、、)values(、、、、);”
是生成相应的吧。
哦,你是说得到这些值,然后用这些生成的SQL语句把XML中的值插入到数据库中去??
zhangsq 2003-08-22
  • 打赏
  • 举报
回复
上面的xml是三个表(user,group,dept)的数据,我想通过java程序解析此xml文件,然后相成相应的insert into user(、、、、)values(、、、、);
insert into group(、、、、)values(、、、、);
insert into group(、、、、)values(、、、、);
insert into group(、、、、)values(、、、、);
insert into dept(、、、、)values(、、、、);
几条 sql语句。
whodsow 2003-08-22
  • 打赏
  • 举报
回复
你最好举例子好好解释一下你的问题,我们可能更好地帮助你。
whodsow 2003-08-22
  • 打赏
  • 举报
回复
你是想要读取xml的代码还是其他的??
你所说的SQL语句,是什么意思,你是想用类似SQL语句的格式(select deptid,deptname from data.xml where .....)从XML文件中读取数据吗??如果是那就不难。
加载更多回复(2)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧