加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

解析XML文档(java)

发布时间:2020-12-15 22:22:08 所属栏目:百科 来源:网络整理
导读:该程序主要是对XML文档进行解析 package com.corejava.serialClone;import java.awt.Component;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import javax.swing.JFileChooser;

该程序主要是对XML文档进行解析

package com.corejava.serialClone;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

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;

/**
 * This program displays an XML document as a tree.
 * 
 * @author root 2014-09-29
 */
public class TreeViewer {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				JFrame frame = new DOMTreeFrame();
				frame.setTitle("TreeViewer");
				frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

/**
 * This frame contains a tree that displays the contents of an XML document.
 * 
 * @author root
 * 
 */
class DOMTreeFrame extends JFrame {
	private static final int DEFAULT_WIDTH = 400;
	private static final int DEFAULT_HEIGHT = 400;

	private DocumentBuilder builder;

	public DOMTreeFrame() {
		setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

		JMenu fileMenu = new JMenu("file");
		JMenuItem openMenu = new JMenuItem("open");
		openMenu.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				openFile();
			}
		});
		fileMenu.add(openMenu);

		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);
		setJMenuBar(menuBar);
	}

	/*
	 * Open a file and load the document
	 */
	public void openFile() {
		// TODO Auto-generated method stub
		JFileChooser choose = new JFileChooser();
		choose.setCurrentDirectory(new File("dom"));

		choose.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 = choose.showOpenDialog(this);
		if (r != JFileChooser.APPROVE_OPTION)
			return;
		final File file = choose.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
					JOptionPane.showMessageDialog(DOMTreeFrame.this,e);
				}
			}
		}.execute();
	}
}

/**
 * 
 * @author root
 * 
 */
class DOMTreeModel implements TreeModel {

	private Document doc;

	public DOMTreeModel(Document doc) {
		this.doc = doc;
	}

	@Override
	public Object getRoot() {
		// TODO Auto-generated method stub
		return doc.getDocumentElement();
	}

	@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

	}
}

/*
 * This class renders as XML node.
 */
class DOMTreeCellRenderer extends DefaultTreeCellRenderer {
	public Component getTreeCellRenderComponent(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,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 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(columnIndex).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,"n");
				i++;
			} else if (builder.charAt(i) == 't') {
				builder.replace(i,"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();
	}
}

实现如图所示


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读