100分求高手帮我将xml文件转为java类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100分求高手帮我将xml文件转为java类相关的知识,希望对你有一定的参考价值。

xml文件内容:
<guirds>
<guird>
<id>1</id>
<name>总目录</name>
<ename>null</ename>
<parentid>0</parentid>
<subguirds>
<guird>
<id>2</id>
<name>关于我们</name>
<ename>about_us</ename>
<parentid>1</parentid>
</guird>
<guird>
<id>3</id>
<name>解决方案</name>
<ename>solution</ename>
<parentid>1</parentid>
<subguirds>
<guird>
<id>6</id>
<name>移动信息化系统</name>
<ename>Mobile_Information</ename>
<parentid>3</parentid>
</guird>
<guird>
<id>7</id>
<name>企业管理咨询</name>
<ename>Management</ename>
<parentid>3</parentid>
</guird>
</subguirds>
</guird>
<guird>
<id>4</id>
<name>案例演示</name>
<ename>case</ename>
<parentid>1</parentid>
</guird>
<guird>
<id>5</id>
<name>我们的服务</name>
<ename>service</ename>
<parentid>1</parentid>
</guird>
</subguirds>
</guird>
</guirds>
我这是模拟数据库的同一表的映射关系写的xml,写小型网站用的。
不会的别说废话,我赶时间
譬如hibernate可以从数据库查数据,再转成java类。我这个只要求将跟根节点的子节点guird转为Guird类,Guird的结构如下:
public class Guird implements java.io.Serializable

private Integer id;
private String name;
private String ename;
private Integer parentId;
private List<Guird> subGuird;
public Guird()


public Guird(Integer turn, String name, String ename, Integer parentId)
this.name = name;
this.ename = ename;
this.parentId = parentId;

get和色省略

没办法,咱们小公司出不起数据库价钱,而我学j2ee只学会建立在数据库上的网站。后来看xml文件可以代替数据库作为保存手段,所以就自己写了这个xml,可惜不会将他转为java类

奋斗了20个小时,终于完成了,本类无需导入任何额外的包,底层细节全部在本类中完成!
说明,本类通过读入xml文件,并把信息正确分成存入到Guird列表中。通过调用getGuirdList()将返回结果集。要使用其中的某一项,只接到对象中用方法获取即可,希望能够满足楼主的需求!!

TransXml.java

import java.io.*;
import java.util.Vector;
import java.util.Scanner;
import java.io.InputStreamReader;
import java.util.LinkedList;

public class TransXml

private String xmlAddress;
private Vector<Guird> guir;//表示一级子目录下的Guird向量
private FileInputStream inStr;
private InputStreamReader inRea;
private int whLayer=0;//标志表的层次,为0表示根表,为1表示第一层子表
private int whiLab=0;//表示当前标签是第几层
boolean isend=false;
boolean isguirs=false;
boolean isguir=false;
StringBuffer str=new StringBuffer();//表示<>中的词
String strVul;
StringBuffer value=new StringBuffer();//表示具体类容
boolean isWorld=false;
boolean isValue=false;
boolean isSubgu=false;
boolean notEnd=true;
LinkedList<Guird> linList;

public TransXml()



public TransXml(String xmlAdd)
guir=new Vector<Guird>();
linList=new LinkedList<Guird>();
this.xmlAddress=xmlAdd;
System.out.println("开始读取xml文件");
try
inStr=new FileInputStream(xmlAddress);
inRea=new InputStreamReader(inStr);
catch(IOException e)
System.out.println("Xml文件地址无效");

System.out.println("开始读取xml文件完成!");
Translate();



public void Translate()

Guird theGu=new Guird();

while(notEnd)

int tt=-1;
try
tt=inRea.read();
catch(IOException e)
System.out.println("字符读取失败!");


if(tt==-1)//文件已经读完了
notEnd=false;
break;


char ch=(char)tt;
if(ch=='<')

//说明,前面如果有类容的话,内容完结

isValue=false;//说明内容已经完了
isWorld=true;//表示下面是<>里德内容

if(ch=='>')

isWorld=false;//表示括号内的字符串结束了

strVul=str.toString();//表示当前的目录层次

if(strVul.equalsIgnoreCase("guirds"))//这是配置文件正式开始的标志
isguirs=true;
else if(strVul.equalsIgnoreCase("guird"))//说明已经进入guird类
isguir=true;
else if(strVul.equalsIgnoreCase("id"))//进入id属性
isValue=true;
else if(strVul.equalsIgnoreCase("name"))//进入name属性
isValue=true;
else if(strVul.equalsIgnoreCase("ename"))//进入ename属性
isValue=true;
else if(strVul.equalsIgnoreCase("parentid"))//进入parentid属性
isValue=true;
else if(strVul.equalsIgnoreCase("subguirds"))//进入subguirds属性,说明它还有一个字表
isSubgu=true;
linList.addLast(theGu);//做入栈操作,添加到结尾
whLayer++;//原始的值为0,它表示当前操作guird的级数
//那么下面的读取将是新的Guird类,所以要把现在的theGu保存后重新初始化
theGu=new Guird();//初始化,后面接着用

else if(strVul.equalsIgnoreCase("/guirds"))//这是配置文件结束的标志
isguirs=false;//程序已经阅读完毕XML文件
notEnd=false;

else if(strVul.equalsIgnoreCase("/guird"))//说明已经结束guird类
isguir=false;//说明一条记录已经完成,所以要对其存储
//theGu的属性是在</标签>前就写入完毕了,那么应该写入上级目录中,
//如果是定定及目录,则直接写入给定的Vector

if(whLayer>0)//说明还不是根目录
Guird tempguir=linList.getLast();

Vector<Guird> tempqq=(Vector)tempguir.getSubGuird();

if(tempqq==null)//说明前面的集合为空
tempqq=new Vector();


tempqq.add(theGu);//集合中增加这一项
tempguir.setSubGuird(tempqq);

linList.removeLast();//移动原来的换新的内容
linList.add(tempguir);
theGu=new Guird();//重新初始化供后面使用,并不要去改变whLayer值

else if(whLayer==0)//这说明当前的theGu是指1级子目录,

guir.add(theGu);//添加一条记录到Vector
theGu=new Guird();// 重新初始化以便下次正确用到
else
System.out.println("xml文件标签错误!");
notEnd=false;


else if(strVul.equalsIgnoreCase("/id"))//结束id属性
isValue=false;
theGu.setId(new Integer(value.toString()));
value=new StringBuffer();

else if(strVul.equalsIgnoreCase("/name"))//结束name属性
isValue=false;
theGu.setName(value.toString());
// System.out.println("这里写入的名字是:"+theGu.getName());
value=new StringBuffer();

else if(strVul.equalsIgnoreCase("/ename"))//结束ename属性
isValue=false;
theGu.setEname(value.toString());
value=new StringBuffer();

else if(strVul.equalsIgnoreCase("/parentid"))//结束parentid属性
isValue=false;
theGu.setParentId(new Integer(value.toString()));
value=new StringBuffer();

else if(strVul.equalsIgnoreCase("/subguirds"))//结束subguirds属性,字表完成
isSubgu=false;
//刚刚结束的这个Guird就是whLayer级子目录
//要判断是根类还是那一级子目录
whLayer--;//表示上一级目录
if(whLayer>0)

theGu=linList.getLast();//成为当前节点
//所以当前操作对象又将是刚从LinkedListed中取出的那个

linList.removeLast();//已经用过了,最后一个移除,相当于退栈

else if(whLayer==0)//根节点下
theGu=linList.getLast();
linList.removeLast();

else
notEnd=false;//因为whLayer不可能小于0
System.out.println(xmlAddress+"标签不完整!请检查!");
break;



strVul="";
str=new StringBuffer();//重新初始化,准备后面使用


if(isWorld==true)
if((char)tt!='<'&&(char)tt!='>')//因为具有延时性所以要增加这个条件
if(tt!=32&&tt!=9)//它不为空格和Tab,即在xml中标签内的内容将忽略Tab和空格
str.append((char)tt);


if(isValue==true)//当前是类容属性值
if((char)tt!='<'&&(char)tt!='>')
if(tt!=32&&tt!=9)//它不为空格和Tab
value.append((char)tt);



/**
* 为什么这里注释掉了,因为前面以当发现value值取到最后一位后就设置isValue为false
* 但是要当下一个</>结尾标签完才会调用value值并进行操作,所以,value不能立刻变为空内容
* 那么当它被使用后,采设置新的对象是可取的
* else
* value=new StringBuffer();//避免干扰下次
*
*/



try
inRea.close();
inStr.close();
catch(IOException e)
System.out.println("流关闭失败!");




public Vector getGuirdList()
return this.guir;//获得最终的子目录列表


/**
* 原来写的main方法进行测试,在这里就省略了
*/


Xml文件中<guirds>标签中,有几对<guird>标签就会返回几条结果,当然<guird>是指在<guirds>目录下的第一层标签,而其他的二级<guird>标签中的内容则存在相应的List<Guird> subGuird中。

That's all !
参考技术A 这个光为一个文件写一段解析xml文件的程序很容易,免不了就是按照你所给出的xml格式逐个元素拆解,然后set到你定义的类里,但是做通用就不那么简单了,想想hibernate,他的.hbm.xml文件里,关于字段的定义包含着大量的字段属性的元素,并不那么简单,需要科学的设计。

我原来也为两个系统间的数据交互写了个这种蹩脚的东西,没有什么问题,但是元素的采集规则一定要设计好,不然你自己就会乱掉,你如果只是想简单的存取下数据,那么你上网搜一下关于java读写xml文件的方法就可以了,简单实用。
参考技术B 显然用反序列化最合适了。最好是用xstream包来解析,我以前写过一点。
http://fortianwei.javaeye.com/blog/357456

如果你还不会的话,我再帮你写,当然了,这种东西最好自己弄,学的才扎实点。java中序列化和反序列化很重要的。
参考技术C 写好了,你自己测试一下看行不行,不过得先导dom4j-1.6.1.jar的第三方包啊!
public class XmlToJava
public XmlToJava()


@SuppressWarnings("unchecked")
public void test()
String xml_path = "src/guird.xml";
SAXReader reader = new SAXReader();
try
FileInputStream fis = new FileInputStream(xml_path);
Document document = reader.read(fis);
fis.close();
Element root = document.getRootElement();
Iterator<Element> it = root.elementIterator();
while (it.hasNext())
Element e = it.next();
Guird g = new Guird();
g = setFeild(e, g);


catch (Exception e)
e.printStackTrace();



/**
* 获取subguirds节点下的所有Guird节点;
*
* @param e
* @return
*/
@SuppressWarnings("unchecked")
public List<Guird> getSubGuird(Element e)
Element subguirds = e.element("subguirds");
if (subguirds == null)
return null;

List<Guird> list = new ArrayList<Guird>();
Iterator<Element> its = subguirds.elementIterator("guird");
while (its.hasNext())
Element guird = its.next();
Guird g = new Guird();
g = setFeild(guird, g);
List<Guird> gs = getSubGuird(guird);
if (gs != null)
g.setSubGuird(gs);

list.add(g);

return list;


/**
* 给Guird对象的id,name,parentid,ename以及subGuird字段设值,然后把这个Guird对象返回;
*
* @param e
* @param g
* @return
*/
public Guird setFeild(Element e, Guird g)
String id = e.elementText("id");
String name = e.elementText("name");
String parentid = e.elementText("parentid");
String ename = e.elementText("ename");
g.setId(Integer.parseInt(id));
g.setName(name);
g.setEname(ename);
g.setParentId(Integer.parseInt(parentid));
// 给subGuird字段设值
g.setSubGuird(getSubGuird(e));
return g;

参考技术D 用java1.6的Compiler试试,它可能把文本(String)类型的类的定义(与.java文件中的文本类似),直接转换成class文件,然后可用反射加载这个类 第5个回答  2010-09-02 你这个到后期会非常麻烦,mysql多好啊,免费的,还简单

JAVA Dom4j解析XML文件异常,请高手帮忙

<Offers xmlns="">
....
</Offers>
以上是一段xml结构字符串,当我用Dom4j解析它时,抛出如下异常:
Element or attribute do not match QName production: QName::=(NCName':')?NCName.
请高手帮忙看下是什么原因
<?xml version="1.0" encoding="UTF-8"?><Offers xmlns:=""><Offer></Offer></Offers>

这个是我通过他人提供的webservice获得的一段xml的字符串

参考技术A 错误原因是说元素或者属性不匹配。
<Offers xmlns:=""> 这个xmlns属性后便可以有冒号么?
在有你确认这个xml文档是正确的?也就是每组标签都是配对的?

你可以把xml文件发给我,这两天正好用dom4j做完一个庞大的xml解析工作。。。本回答被提问者和网友采纳
参考技术B xmlns:=""
不可以有冒号,或者你要在冒号后加上内容,xmlns:aa="...",如果加上的话解析的时候也要设置相应的名称空间,Node对象有个createXPath方法,他有设置名称空间的方法,selectNode可以执行xpath表达式,
我的建议是:
1、学学xml吧,也好知道xmlns是干吗用的
http://www.w3school.com.cn/xml/index.asp
2、学学xpath,对你解析xml和使用dom4j会有很大帮助
http://www.w3school.com.cn/xpath/index.asp
参考技术C 理解一下xmlns!
"xmlns"是XHTML namespace的缩写!
是不是xml问题!
参考:http://blog.csdn.net/carefree31441/archive/2008/11/06/3235849.aspx

以上是关于100分求高手帮我将xml文件转为java类的主要内容,如果未能解决你的问题,请参考以下文章

java中DOM解析XML文件 请高手帮助

java json 转为xml文件

读取在java中存储为字符串的xml [重复]

Groovy自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称节点值节点属性子节点 | 将封装的节点数据转为 Xml 字符串 )

谁能帮我把XML文件转换为XSD和XSL文件?

java解析XML修改特定项的值然后保存xml文件,求高手帮忙 急需 在线等