2009-05-27技术学习:Java中对XML文档的操作
来源:互联网 发布:win8.1办公软件 编辑:程序博客网 时间:2024/06/06 00:50
从《Core Java》中得到的一个例子,只是读取操作。从这里看出用Java操作XML真的是很麻烦的事情,这点比.Net要落后很多,或许还有很好的工具——肯定有,Java的工具成千上万,但我目前还不知道。
把这段辛苦打出来的代码贴上,其中还有一些不明白的代码,只是先体验一下,并且能读XML就行了。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package zero;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.tree.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
/**
*
* @author Administrator
*/
public class DOMTreeTest {
public static void main(String[] args) throws InterruptedException, InvocationTargetException{
EventQueue.invokeAndWait(new Runnable(){
public void run(){
JFrame frame = new DOMTreeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class DOMTreeFrame extends JFrame {
private DocumentBuilder builder;
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 400;
public DOMTreeFrame() {
setTitle("DOMTreeTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
JMenu fileMenu = new JMenu("File");
JMenuItem openItem = new JMenuItem("open");
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
openFile();
}
});
fileMenu.add(openItem);
JMenuItem exitItem = new JMenuItem("exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenu.add(exitItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
setJMenuBar(menuBar);
}
public void openFile() {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
@Override
public boolean accept(File f) {
return f.isDirectory() || f.getName().toLowerCase().endsWith(".xml");
}
@Override
public String getDescription() {
return "XML files!";
}
});
int r = chooser.showOpenDialog(this);
if (r != JFileChooser.APPROVE_OPTION) {
return;
}
final File file = chooser.getSelectedFile();
new SwingWorker<Document, Void>() {
@Override
protected Document doInBackground() throws Exception {
if (builder == null) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
}
return (Document) builder.parse(file);
}
@Override
protected void done() {
try {
Document doc = get();
JTree tree = new JTree(new DOMTreeModel(doc));
tree.setCellRenderer((TreeCellRenderer) new JScrollPane(tree));
validate();
} catch (Exception e) {
JOptionPane.showMessageDialog(DOMTreeFrame.this, e);
}
}
}.execute();
}
}
class DOMTreeModel implements TreeModel {
private Document doc;
public DOMTreeModel(Document doc) {
this.doc = doc;
}
public Object getRoot() {
return doc.getDocumentElement();
}
public Object getChild(Object parent, int index) {
Node node = (Node) parent;
NodeList list = node.getChildNodes();
return list.item(index);
}
public int getChildCount(Object parent) {
Node node = (Node) parent;
NodeList list = node.getChildNodes();
return list.getLength();
}
public boolean isLeaf(Object node) {
return getChildCount(node) == 0;
}
public int getIndexOfChild(Object parent, Object child) {
Node node = (Node) parent;
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if (getChild(node, i) == child) {
return i;
}
}
return -1;
}
public void addTreeModelListener(TreeModelListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void removeTreeModelListener(TreeModelListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void valueForPathChanged(TreePath path, Object newValue) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
class DOMTreeCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
Node node = (Node) value;
if (node instanceof Element) {
return elementPanel((Element) node);
}
super.getTreeCellRendererComponent(tree, value, leaf, expanded, leaf, row, hasFocus);
if (node instanceof CharacterData) {
setText(characterString((CharacterData) node));
} else {
setText(node.getClass() + ": " + node.toString());
}
return this;
}
public static JPanel elementPanel(Element e) {
JPanel panel = new JPanel();
panel.add(new JLabel("Element: " + e.getTagName()));
final NamedNodeMap map = e.getAttributes();
panel.add(new JTable(new AbstractTableModel() {
public int getRowCount() {
return map.getLength();
}
public int getColumnCount() {
return 2;
}
public Object getValueAt(int rowIndex, int c) {
return c == 0 ? map.item(rowIndex).getNodeName() : map.item(rowIndex).getNodeValue();
}
}));
return panel;
}
public static String characterString(CharacterData node) {
StringBuilder builder = new StringBuilder(node.getData());
for (int i = 0; i < builder.length(); i++) {
if (builder.charAt(i) == '/r') {
builder.replace(i, i + 1, "//r");
i++;
} else if (builder.charAt(i) == '/n') {
builder.replace(i, i + 1, "//n");
i++;
} else if (builder.charAt(i) == '/t') {
builder.replace(i, i + 1, "//t");
i++;
}
}
if (node instanceof CDATASection) {
builder.insert(0, "CDATASection:");
} else if (node instanceof Text) {
builder.insert(0, "Text:");
} else if (node instanceof Comment) {
builder.insert(0, "Comment:");
}
return builder.toString();
}
}
- 2009-05-27技术学习:Java中对XML文档的操作
- java中利用dom4j对XML文档的创建、解析、查找、修改、保存等操作。
- java中利用dom4j对XML文档的创建、解析、查找、修改、保存等操作。
- java中sax对xml的操作
- 学习文档XML,对execl操作
- ASP对XML文档的操作(DOM)
- C#对XML文档的操作[转载]
- simple对xml文档的操作
- dom4j对xml文档的操作
- dom4j对xml文档的操作
- Java学习之路——利用JDOM对xml文档进行解析等操作实例
- Ruby中对XML文档的解析
- Ruby中对XML文档的解析
- xml.dom 模块对xml文档的基本操作
- Java中对XML四种操作方式的使用
- Java里面对XML文档的处理
- java--JAXP对xml文档的解析
- XML学习---利用Java对XML文档的增、删、改、查
- 终身的网站
- 判断两个集合包含关系
- 乱
- javascript display
- 公司推荐饲料厂生产管理系统
- 2009-05-27技术学习:Java中对XML文档的操作
- 个人小技巧
- UCenter Home二次开发指南
- 比较Java中几种数据cache方式
- 身体发肤,受之父母,不敢毁伤,孝至始也。
- Ubuntu Linux下配置Qt4的方法
- How to setup/configure multiple stores in Magento?
- java c/s server
- dwr例外被抛出且未被接住