`
melord
  • 浏览: 145643 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

dom4j解析xml文件做为JTable的数据模型

阅读更多
本例展现一个Swing JTable的示例,其中表格中的数据模型来自xml文件,当表格中的数据被编缉过后,可以通过save按钮将数据保存到xml文件当中。对xml文件的解析使用了dom4j的解析方式,因此为确保您的编译通过,需要将dom4j.x.x.x.jar加入到classpath中,本例中,使用的dom4j版本为1.6.1。

要读取的xml文件(p.xml)内容如下:
<table name="person">
	<columns>
		<column name="name" type="java.lang.String"></column>
		<column name="gander" type="java.lang.String"></column>
		<column name="age" type="java.lang.Integer"></column>
		<column name="batcher" type="java.lang.Boolean"></column>
	</columns>
	<tr>
		<td>lijm</td>
		<td>male</td>
		<td>25</td>
		<td>true</td>
	</tr>
	<tr>
		<td>guyy</td>
		<td>female</td>
		<td>22</td>
		<td>true</td>
	</tr>
</table>


模型提供类,主要包括两个功能:
1,解析xml文件并封装为一个TableModel
2,将TableModel保存到xml文件中

package component.table;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * JTable模型提供者,它从xml文件中读取列的定义与行数据,封装到一个XmlTableModel对象中
 * 
 * @see XmlTableModel
 * @author Administrator
 * 
 */
public class TableModelProvider {

	/**
	 * 解析指定的xml文件,生成表格数据模型
	 * 
	 * @param name
	 *            xml文件路径名称
	 * @return XmlTableModel
	 */
	public XmlTableModel getModel(String name) {
		Document doc = getDocument(name);
		List<Column> columns = getComumns(doc);
		Vector<Object[]> vector = getRows(doc, columns);
		Object[] names = columns.toArray(new Column[columns.size()]);
		return new XmlTableModel(names, vector);

	}

	/**
	 * 解析指定的xml文件,返回其文档对象
	 * 
	 * @param file
	 * @return
	 */
	public Document getDocument(String file) {
		SAXReader reader = new SAXReader();
		Document document = null;
		try {
			document = reader.read(new File(file));
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		return document;
	}

	/**
	 * 保存xml Dom到指定的文件当中
	 * 
	 * @param doc
	 * @param name
	 */
	public void saveDocument(Document doc, String name) {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		try {
			XMLWriter writer = new XMLWriter(format);
			FileOutputStream fos = new FileOutputStream(name);
			writer.setOutputStream(fos);
			writer.write(doc);
			fos.close();
		} catch (UnsupportedEncodingException e) {

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析xml Dom中的列
	 * 
	 * @param doc
	 * @return
	 */
	private List<Column> getComumns(Document doc) {
		ArrayList<Column> list = new ArrayList<Column>();
		Element root = doc.getRootElement();
		Iterator<Element> el = root.element("columns")
				.elementIterator("column");
		while (el.hasNext()) {
			Element e = (Element) el.next();
			Column c = new Column(e.attributeValue("name"), e
					.attributeValue("type"));
			list.add(c);
		}
		return list;
	}

	/**
	 * 解析xml Dom中的行
	 * 
	 * @param doc
	 * @param columns
	 * @return
	 */
	private Vector<Object[]> getRows(Document doc, List<Column> columns) {
		Vector<Object[]> vector = new Vector<Object[]>();
		Element root = doc.getRootElement();
		List<Node> trList = root.elements("tr");
		for (int i = 0; i < trList.size(); i++) {
			Element tr = (Element) trList.get(i);
			List<Object> list2 = new ArrayList<Object>();
			List<Node> tdList = tr.elements("td");
			for (int j = 0; j < tdList.size(); j++) {
				Element td = (Element) tdList.get(j);
				list2
						.add(getTDValue(columns.get(j).getType(), td
								.getTextTrim()));
			}
			vector.add(list2.toArray(new Object[list2.size()]));
		}
		return vector;
	}

	/**
	 * 根据列定义的类型,对单元格中的数据进行类型转换
	 * 
	 * @param type
	 * @param value
	 * @return
	 */
	private Object getTDValue(String type, String value) {
		if ("java.lang.Integer".equals(type)) {
			return Integer.parseInt(value);
		}
		if ("java.lang.Boolean".equals(type)) {
			return Boolean.parseBoolean(value);
		}
		return value;
	}

	/**
	 * 将表格的数据模型保存到xml文件当中
	 * 
	 * @param model
	 * @param file
	 */
	public void saveModel(TableModel model, String file) {
		Document doc = DocumentHelper.createDocument();
		Element root = DocumentHelper.createElement("table");
		doc.setRootElement(root);
		Element columns = DocumentHelper.createElement("columns");
		for (int i = 0; i < model.getColumnCount(); i++) {
			Element column = DocumentHelper.createElement("column");
			column.addAttribute("name", model.getColumnName(i));
			column.addAttribute("type", model.getColumnClass(i).getName());
			columns.add(column);
		}
		root.add(columns);
		for (int i = 0; i < model.getRowCount(); i++) {
			Element tr = DocumentHelper.createElement("tr");
			for (int j = 0; j < model.getColumnCount(); j++) {
				Element td = DocumentHelper.createElement("td");
				td.setText(model.getValueAt(i, j).toString());
				tr.add(td);
			}
			root.add(tr);
		}
		saveDocument(doc, file);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TableModelProvider provider = new TableModelProvider();
		System.out.println(provider.getModel("p.xml"));
	}

}

/**
 * 表格列信息实体Bean
 * 
 * @author Administrator
 * 
 */
class Column {

	String name;
	String type;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Column(String name, String type) {
		this.name = name;
		this.type = type;
	}

	@Override
	public String toString() {
		return name;
	}
}

/**
 * 自定义的表格模型
 * @author Administrator
 *
 */
class XmlTableModel extends AbstractTableModel {

	private Object[] names;
	private Vector<Object[]> rows;

	public XmlTableModel(Object[] names, Vector<Object[]> rows) {
		this.rows = rows;
		this.names = names;
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return names.length;
	}

	@Override
	public int getRowCount() {
		return rows.size();
	}

	@Override
	public Object getValueAt(int row, int col) {
		return rows.get(row)[col];
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return getValueAt(0, columnIndex).getClass();
	}

	@Override
	public String getColumnName(int column) {
		return names[column].toString();
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		if (columnIndex >= 0 && columnIndex <= getColumnCount()) {
			return true;
		} else {
			return false;
		}
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		rows.get(rowIndex)[columnIndex] = aValue;
	}
}


下面的代码演示运行效果
package component.table;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class MyTableTest extends JFrame {

	public MyTableTest() {

		final TableModelProvider provider = new TableModelProvider();
		final JTable t = new JTable();
		t.setModel(provider.getModel("p.xml"));

		JScrollPane pane = new JScrollPane(t);
		// t.setAutoResizeMode(JTable.)
		pane.getViewport().setSize(new Dimension(t.getWidth(), t.getHeight()));
		this.getContentPane().add(BorderLayout.CENTER, pane);

		JButton btn = new JButton("Save");
		btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				provider.saveModel(t.getModel(), "p2.xml");
				JOptionPane.showMessageDialog(null, "已将表格中的数据保存到p2.xml中");
			}
		});
		this.getContentPane().add(BorderLayout.SOUTH, btn);

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setVisible(true);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new MyTableTest();
	}

}


分享到:
评论

相关推荐

    XMLEditor-java源码实现.zip

    编辑功能则涉及到了DOM(Document Object Model)模型,DOM模型是XML文档的一种树形表示,Java中可以通过`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`等类来操作DOM模型,实现对XML文件内容...

    JAVA_API1.6文档(中文)

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    Swing实现的备忘录(桌面版)

    4. **XML解析与序列化**:使用Java的DOM API或SAX API读取XML文件中的日程数据,将其加载到内存中的数据结构中。同时,当用户保存或关闭应用时,将数据结构序列化回XML文件。 5. **用户界面设计**:通过自定义组件...

    基于Java Swing的学生信息管理(文档+视频+源码).zip

    CSV文件可以通过逐行读取和写入实现,而XML文件则需使用DOM或SAX解析器进行解析和生成。 六、IDE支持 在开发过程中,IntelliJ IDEA、Eclipse等集成开发环境(IDE)提供了强大的工具支持,包括代码自动补全、调试、...

    [Java参考文档]

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    JavaAPI中文chm文档 part2

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    JavaAPI1.6中文chm文档 part1

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml...

    [Java参考文档].JDK_API 1.6

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml....

    java api最新7.0

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml....

    1.5api-part4

    在Java中,DOM(文档对象模型)和SAX(简单API for XML)是解析XML的常见方式。JAXB(Java Architecture for XML Binding)则允许将XML文档与Java对象之间进行绑定,便于数据处理。 2. **Swing**:Swing是Java的GUI...

    Java 1.6 API 中文 New

    javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml....

    Java API 1.6 文档中文版

    Java 1.6的DOM和SAX解析器可以解析XML文档,JAXB则用于XML与Java对象之间的转换。此外,JDOM和XOM是两个流行的第三方XML处理库。 11. **安全** Java的安全模型包括权限、策略和证书等概念,安全管理器可以控制...

    个人JAVA笔记汇总

    3. **XML处理**: Java提供DOM(Document Object Model)和SAX(Simple API for XML)两种主要的解析方式。DOM将整个XML文档加载到内存中,方便查询但消耗资源;SAX是事件驱动的,只在遇到XML元素时触发事件,节省...

    java api1.6中文文档chm

    8. **XML处理**:`javax.xml`包提供了处理XML文档的API,如`DOM`、`SAX`解析器和`Transformer`等。 9. **数据库连接**:`java.sql`包提供了连接和操作关系型数据库的接口和类,如`Connection`、`Statement`、`...

    java 股票查看软件

    3. **XML/JSON解析**:数据通常以XML或JSON格式从服务器返回,Java提供了DOM、SAX和Jackson等库进行解析,将这些数据转化为可操作的对象。 二、股票数据采集 1. **网页抓取**:软件可能使用了Web Scraping技术,...

    java帮助文档

    8. **XML处理**: JDK 6包含了DOM、SAX和JAXB等多种处理XML的API,方便了XML文档的解析和生成。 9. **脚本引擎**: 通过ScriptEngine接口,JDK 6支持JavaScript、Groovy等脚本语言在Java环境中运行。 10. **JMX**: ...

    jdk6的支持文档

    8. **XML处理**:JDK 6中的`javax.xml`包进一步完善,包括DOM、SAX和StAX解析器,使得XML处理更加灵活和高效。 9. **安全增强**:JDK 6在安全方面也做了很多工作,包括证书和密钥管理的改进,以及更强的加密算法...

Global site tag (gtag.js) - Google Analytics