Java核心技术II:解析XML文档

来源:互联网 发布:随机森林优化 编辑:程序博客网 时间:2024/05/17 20:10

程序清单:2-1 DOMTreeTest.java

import java.awt.Component;import java.awt.EventQueue;import java.awt.Panel;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import javax.print.Doc;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTree;import javax.swing.SwingWorker;import javax.swing.event.TreeModelListener;import javax.swing.filechooser.FileFilter;import javax.swing.table.AbstractTableModel;import javax.swing.tree.DefaultTreeCellRenderer;import javax.swing.tree.TreeCellRenderer;import javax.swing.tree.TreeModel;import javax.swing.tree.TreePath;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.eclipse.jdt.internal.compiler.lookup.InvocationSite.EmptyWithAstNode;import org.omg.CORBA.PUBLIC_MEMBER;import org.w3c.dom.CDATASection;import org.w3c.dom.CharacterData;import org.w3c.dom.Comment;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Text;/** *  *//** * @author Administrator *新浪微博:ouc大飞 */public class DOMTreeTest {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        EventQueue.invokeLater(new  Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub                JFrame frame=new  DOMTreeFrame();                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setVisible(true);            }        });    }}class DOMTreeFrame extends JFrame{    /**     *      */    public DOMTreeFrame(){        setTitle("DOMTreeTest");        setSize(DEFAULT_HIGHT, DEFAULT_WIDTH);        JMenu fileMenu=new  JMenu("file");        JMenuItem openitem=new  JMenuItem("Open");        openitem.addActionListener(new  ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO Auto-generated method stub                openFile();            }        });        fileMenu.add(openitem);        JMenuItem exitItem=new  JMenuItem("exit");        exitItem.addActionListener(new  ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO Auto-generated method stub                System.exit(0);            }        });        fileMenu.add(exitItem);        JMenuBar bar=new  JMenuBar();        bar.add(fileMenu);        setJMenuBar(bar);    }    public void openFile(){        JFileChooser chooser=new  JFileChooser();        chooser.setCurrentDirectory(new  File("."));        chooser.setFileFilter(new  FileFilter() {            @Override            public String getDescription() {                // TODO Auto-generated method stub                return "XML files";            }            @Override            public boolean accept(File f) {                // TODO Auto-generated method stub                return f.isDirectory()||f.getName().toLowerCase().endsWith(".xml");            }        });        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 {                // TODO Auto-generated method stub                if(builder==null)                {                    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();                    builder=factory.newDocumentBuilder();                }                return builder.parse(file);            }            protected void done(){                try {                    Document doc=get();                    JTree tree=new  JTree(new  DOMTreeModel(doc));                    tree.setCellRenderer(new  DOMTreeCellRenderer());                    setContentPane(new  JScrollPane(tree));                    validate();                } catch (Exception e) {                    // TODO: handle exception                    e.printStackTrace();                }            }        }.execute();    }    private DocumentBuilder builder;    private static final int DEFAULT_WIDTH=400;    private static final int DEFAULT_HIGHT=400;}class DOMTreeModel implements TreeModel{    public DOMTreeModel(Document doc){        this.doc=doc;    }    @Override    public Object getRoot() {        return doc.getDocumentElement();        // TODO Auto-generated method stub    }    @Override    public Object getChild(Object parent, int index) {        // TODO Auto-generated method stub        Node node=(Node)parent;        NodeList list=node.getChildNodes();        return list.item(index);    }    @Override    public int getChildCount(Object parent) {        // TODO Auto-generated method stub        Node node=(Node)parent;        NodeList list=node.getChildNodes();        return list.getLength();    }    @Override    public boolean isLeaf(Object node) {        // TODO Auto-generated method stub        return getChildCount(node)==0;    }    @Override    public void valueForPathChanged(TreePath path, Object newValue) {        // TODO Auto-generated method stub    }    @Override    public int getIndexOfChild(Object parent, Object child) {        // TODO Auto-generated method stub        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;    }    @Override    public void addTreeModelListener(TreeModelListener l) {        // TODO Auto-generated method stub    }    @Override    public void removeTreeModelListener(TreeModelListener l) {        // TODO Auto-generated method stub    }    private Document doc;}class DOMTreeCellRenderer extends DefaultTreeCellRenderer{    public Component getTreeCellRenderComponent(JTree jTree,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(jTree, value, selected, 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 jPanel=new  JPanel();        jPanel.add(new JLabel("element:"+e.getTagName())  );        final NamedNodeMap map=e.getAttributes();        jPanel.add(new  JTable(new  AbstractTableModel(){            @Override            public int getRowCount() {                // TODO Auto-generated method stub                return map.getLength();            }            @Override            public int getColumnCount() {                // TODO Auto-generated method stub                return 2;            }            @Override            public Object getValueAt(int r, int c) {                // TODO Auto-generated method stub                return c==0?map.item(r):map.item(r).getNodeValue();            }        }));        return jPanel;    }    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();    }}
0 0
原创粉丝点击