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();

    }

}

原创粉丝点击