天天看點

Swing dom 解析 XML 檢視 xml文檔結構

package org.chapter.xml;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.File;

import java.util.concurrent.ExecutionException;

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.TreeModel;

import javax.swing.tree.TreePath;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

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 org.w3c.dom.Text;

public class DomTreeTest {

public static void main(String[] args) {

new DomTreeJframe();

}

}

class DomTreeJframe extends JFrame {

//文檔建構

private DocumentBuilder builder;

public DomTreeJframe() {

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setTitle("DOM 解析xml檔案");

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

this.setBounds((dim.width - 500) / 2, (dim.height - 500) / 2, 500, 500);

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 menubar=new JMenuBar();

menubar.add(fileMenu);

this.setJMenuBar(menubar);

}

//打開一個檔案和加載一個文檔

public void openFile(){

JFileChooser chooser =new JFileChooser();

//設定目前檔案目錄

chooser.setCurrentDirectory(new File("."));

//過濾  javax.swing.filechooser.FileFilter 一個類

chooser.setFileFilter(new FileFilter() {

@Override

public String getDescription() {

return "XML  files";

}

@Override

public boolean accept(File f) {

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 {

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 (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ExecutionException e) {

// TODO Auto-generated catch block

JOptionPane.showMessageDialog(DomTreeJframe.this,e);

}

}

}.execute();

}

}

// DOM 樹

class DOMTreeModel implements TreeModel{

private Document doc;

public DOMTreeModel(Document doc) {

this.doc=doc;

}

@Override

public Object getRoot() {

// TODO Auto-generated method stub

return this.doc.getDocumentElement();

}

@Override

public Object getChild(Object parent, int index) {

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) {

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

}

}

class DOMTreeCellRenderer extends DefaultTreeCellRenderer{

 @Override

public Component getTreeCellRendererComponent(JTree tree, Object value,

boolean sel, boolean expanded, boolean leaf, int row,

boolean hasFocus) {

   Node node=(Node)value;

   if(node instanceof Element) 

    return elementPanel((Element)node); 

super.getTreeCellRendererComponent(tree, value, sel, 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() {

@Override

public Object getValueAt(int rowIndex, int columnIndex) {

// TODO Auto-generated method stub

return columnIndex==0?map.item(rowIndex).getNodeName():map.item(rowIndex).getNodeValue();

}

@Override

public int getRowCount() {

// TODO Auto-generated method stub

return  map.getLength();

}

@Override

public int getColumnCount() {

// TODO Auto-generated method stub

return 2;

}

}));

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

 }

}