java 解析xml文档,解析XML文档(java)

该程序主要是对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() {

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

}

}

实现如图所示

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值