从《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();
}
}