100分求读取xml到对象的源码:

ITJunior 2005-01-10 10:52:44
XML格式如下:
<classes>
<class>
<ID>00000001</ID>
<grade>高一</grade>
<teacher>余波</teacher>
<students>
<student>
<ID>0001</ID>
<name>张三</name>
<hight>175cm</hight>
</student>
<student>
<ID>0002</ID>
<name>李四</name>
<hight>175cm</hight>
</student>
<student>
<ID>0003</ID>
<name>王五</name>
<hight>175cm</hight>
</student>
</students>
</class>
<class>
<ID>00000002</ID>
<grade>高二</grade>
<teacher>丁小惠</teacher>
<students>
<student>
<ID>0001</ID>
<name>张三</name>
<hight>175cm</hight>
</student>
<student>
<ID>0002</ID>
<name>李四</name>
<hight>175cm</hight>
</student>
<student>
<ID>0003</ID>
<name>王五</name>
<hight>175cm</hight>
</student>
</students>
</class>
<class>
<ID>00000002</ID>
<grade>高三</grade>
<teacher>王祥</teacher>
<students>
<student>
<ID>0001</ID>
<name>张三</name>
<hight>175cm</hight>
</student>
<student>
<ID>0002</ID>
<name>李四</name>
<hight>175cm</hight>
</student>
<student>
<ID>0003</ID>
<name>王五</name>
<hight>175cm</hight>
</student>
</students>
</class>
</classes>
对象结构如下:
class 班级 { //主表属性 ... Set 学生 = new HashSet(); }
###从xml每读取一个班级,生成一个班级对象,谁可以给我演示代码?
...全文
340 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeFans 2005-01-17
  • 打赏
  • 举报
回复
建议使用digester, 这个东西的灵活性比较高, 不用你得格式改变后还做程序的大范围的调整
fog628 2005-01-17
  • 打赏
  • 举报
回复
//没做错误处理

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

import java.util.HashSet;
import java.util.ArrayList;

//学生类
class Student{
private String ID, name, higth;
Student(String i, String n, String h){
ID = i;
name = n;
higth = h;
}
//因为得放入HashSet,所以得重写以下两个方法
public int hashCode(){
return Integer.parseInt(this.ID);
}
public boolean equals(Object o){
if(!(o instanceof Student))
return false;
if(this.ID.equals(((Student)o).ID))
return true;
else
return false;
}
public String toString(){
return "Stu ID: " + ID + " Stu Name: "
+ name + "Stu Higth: " + higth + '\n';
}
}

//班级类
class Cls{
private String ID, grade, teacher;
public HashSet students;
Cls(String i, String g, String t, HashSet s){
ID = i;
grade = g;
teacher = t;
students = s;
}
public String toString(){
return "classID: " + ID + " grade: " + grade
+ " teacher: "+ teacher + "\n"
+ students.toString();
}
}

class SAXParserHandler extends DefaultHandler{
//存放班级的集合
private ArrayList classes = new ArrayList();
//存放学生的集合
private HashSet students;// = new HashSet();
//当前的元素名称
private String currentElementName;

//因为class的元素和student的元素有重复
//false表示当前为class下的元素
//true表示当前为student下的元素
private boolean isStudentFlag = false;

//存放class和student的元素的值
private String classID, grade, teacher;
private String studentID, name, higth;

//遇到一个文本就会调用这个方法一次
public void characters(char[] ch,int start,int length)
throws SAXException{

String s = new String(ch, start, length).trim();
if(!s.equals("")){
if(!isStudentFlag){
if(currentElementName.equals("ID")){
classID = s;
}else if(currentElementName.equals("grade")){
grade = s;
}else if(currentElementName.equals("teacher")){
teacher = s;
}
}else{
if(currentElementName.equals("ID")){
studentID = s;
}else if(currentElementName.equals("name")){
name = s;
}else if(currentElementName.equals("hight")){
higth = s;
}
}
}
}

//开始一个元素就会调用这个方法一次
public void startElement(String namespaceURI,String localName,
String qName,Attributes atts)throws SAXException{

if(qName.equals("students")){
isStudentFlag = true;
//这里必须得new一个新的HashSet,
//否则每个班级对象都用的是同一个HashSet
students = new HashSet();
}
currentElementName = qName;
}

//结束一个元素就会调用这个方法一次
public void endElement(String namespaceURI,String localName,
String qName)throws SAXException{

if(qName.equals("students")){
isStudentFlag = false;
}
//解析完一个学生,将创建一个Student的实例放入HashSet
if(qName.equals("student")){
students.add(new Student(studentID, name, higth));
}
//解析完一个班级,将创建一个Cls的实例放入ArrayList
if(qName.equals("class")){
classes.add(new Cls(classID, grade, teacher, students));
}
}

//得到班级的集合
public ArrayList getArrayListOfClasses(){
return classes;
}

}
//一个测试解析用的类
public class ParseClasses{
public static void main(String [] args) throws Exception{
SAXParserFactory fct = SAXParserFactory.newInstance();
SAXParser parser = fct.newSAXParser();
SAXParserHandler handler = new SAXParserHandler();
parser.parse("classes.xml", handler);
System.out.println(handler.getArrayListOfClasses());
}
}


fog628 2005-01-17
  • 打赏
  • 举报
回复
楼主:

以下是我抽空写的一个用SAX解析的程序。

虽然可以解析出来,不过感觉这样没什么灵活性,

但愿有高手出现指点一二,如果楼主觉得有什么还得改的话,

请告之一下
cyicecream 2005-01-12
  • 打赏
  • 举报
回复
yong CASTOR XML技术
joyaga 2005-01-12
  • 打赏
  • 举报
回复
顶学习
herbage_h2h 2005-01-12
  • 打赏
  • 举报
回复
利用dom已经非常方便了,dom对象本身就已经是xml文件的一颗树形表示,你所要做的只是对这颗树进行操作
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;

public class XMLBeginning {
static int layer = 0;
static final int INDENT = 4;
public static void iterate(Node node) {
NodeList list = node.getChildNodes();
int childLength = list.getLength();
if (childLength <= 0) {
String s = node.getNodeValue();
if (s != null && !s.equals("")&&s.equals("\r")) {
for (int j = 0; j < layer * INDENT; j++)
System.out.print(' ');
System.out.println(s);
}
return;
}
String p = node.getNodeName();
if (p != null && !p.equals("")) {
for (int j = 0; j < layer * INDENT; j++)
System.out.print(' ');
System.out.println(p);
}
layer++;
for (int i = 0; i < childLength; i++) {
iterate(list.item(i));
}
layer--;
}
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document xmlDoc = builder.parse("test.xml");
iterate(xmlDoc);
}
}
fog628 2005-01-11
  • 打赏
  • 举报
回复
上面这个是一个很简单的SAX的

解析程序,具体的算法自己再实现一下,

应该不是很难
fog628 2005-01-11
  • 打赏
  • 举报
回复
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

class SAXParserHandler extends DefaultHandler{
public void startDocument()throws SAXException{
System.out.println("起始文档");
}
public void endDocument()throws SAXException{
System.out.println("结束文档");
}
public void characters(char[] ch,int start,int length)
throws SAXException{
String charString=new String(ch,start,length);
System.out.println("字符:"+charString);
}
public void startElement(String namespaceURI,String localName,
String qName,Attributes atts)throws SAXException{
System.out.println("起始元素"+qName);
for(int i=0;i<atts.getLength();i++){
System.out.println("属性值:"+atts.getValue(i));
}
}
public void endElement(String namespaceURI,String localName,
String qName)throws SAXException{
System.out.println("结束元素"+qName);
}

}

public class Books{
public static void main(String a[])throws Exception{
SAXParserFactory f=SAXParserFactory.newInstance();
SAXParser parser=f.newSAXParser();
parser.parse("Books.xml",new SAXParserHandler());

}
}
everydaystb 2005-01-11
  • 打赏
  • 举报
回复
建议使用Apache的Commons中的digester来搞, 这个开源工程就是为了将xml读成对象的,http://jakarta.apache.org/commons/digester/上有说明的。
jwbecalm 2005-01-11
  • 打赏
  • 举报
回复
http://bbs.xml.org.cn/resource.asp
有几篇IBM的文章,去看看吧:
使用 JDBC 将 XML 中的数据插入到数据库(IBM)
使用 JDBC 将数据抽取到 XML 中(IBM)
自己试验比要别人写的代码好,里面教你一步一步实现
ITJunior 2005-01-10
  • 打赏
  • 举报
回复
怎么这个帖子到现在都结不了呢?
shan1119 2005-01-10
  • 打赏
  • 举报
回复
学习
wj8384 2005-01-10
  • 打赏
  • 举报
回复
呵呵 楼上写的话 给我发一份
偶滴邮箱
wj8384@126.com
fog628 2005-01-10
  • 打赏
  • 举报
回复
今天有点忙,楼主什么时候要,我可以帮着试写一下
ITJunior 2005-01-10
  • 打赏
  • 举报
回复
谁可针对例子写一段演示代码?
night__cat 2005-01-10
  • 打赏
  • 举报
回复
ding
wj8384 2005-01-10
  • 打赏
  • 举报
回复
能给段详细的代码吗?
drugon 2005-01-10
  • 打赏
  • 举报
回复
sax中是对选定的元素处理很快的。你想做什么?
象你这们的XML,只要有那几个startDoucument(),startElement(),endElement,endDocument()这几个方法就可以了。

有些方法名可能打错了,基本上就那么几个。
wj8384 2005-01-10
  • 打赏
  • 举报
回复
顶下
谢谢
mahf 2005-01-10
  • 打赏
  • 举报
回复
用jdom 很容易呀!
加载更多回复(12)

62,614

社区成员

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

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