xml编辑器---xmleditor

本文介绍了一款 Java 实现的 XML 编辑器,详细展示了其核心功能实现过程,并提供了源码供读者参考。通过该编辑器,用户能够便捷地编辑 XML 文档,体验 XML 数据管理的强大能力。

关于xml的编辑器,在网上搜了大量的资料,后来经过试验终于完成了xmleditor的功能,现在贴出源码,希望大家能编辑出来!亲自实习,保证能运行!

import java.io.ByteArrayInputStream;
mport javax.xml.parsers.*;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XTree extends JTree {
  private DefaultMutableTreeNode treeNode;
  private DocumentBuilderFactory dbf;
  private DocumentBuilder db;
  private Document doc;
//  public XTree(String text) throws ParserConfigurationException{
//	  super();
//	  getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
//	  setShowsRootHandles(true);
//	  setEditable(false);
//	  dbf=DocumentBuilderFactory.newInstance();
//	  dbf.setValidating(false);
//	  db=dbf.newDocumentBuilder();
//	  treeNode=createTreeNode(parseXml(text));
//	  setModel(new DefaultTreeModel(treeNode));
//  }
  public XTree(String text)throws ParserConfigurationException{
	  this();
	  refresh(text);
	 // buildTree(text);
  }
  public  void refresh(String text) {
	// TODO Auto-generated method stub
	setModel(buildTree(text));
}
public XTree()throws ParserConfigurationException{
	  super();
	  getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
	  setShowsRootHandles(true);
	  setEditable(false);
	  dbf=DocumentBuilderFactory.newInstance();
	  dbf.setValidating(false);
	  db=dbf.newDocumentBuilder();
	  setModel(buildWelcomTree());
  }
  private DefaultTreeModel buildTree(String text){
	  DefaultMutableTreeNode treeNode;
	  Node newNode;
	  newNode =parseXml(text);
	  if(newNode!=null){
		  treeNode=createTreeNode(newNode);
		  return new DefaultTreeModel(treeNode);
	  }
	  else
		  return null;
  }
  private DefaultTreeModel buildWelcomTree(){
	  DefaultMutableTreeNode root;
	  DefaultMutableTreeNode instructions,openingDoc,
	  										editingDoc,savingDoc;
	  DefaultMutableTreeNode openingDocText,editingDocText,
  											savingDocText;
	  DefaultMutableTreeNode development,addingFeatures,
	  										contactingKyle;
	  root=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  instructions=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  openingDoc=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  openingDocText=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  editingDoc=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  editingDocText=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  savingDoc=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  savingDocText=new DefaultMutableTreeNode("Welcome to XML View 1.0");
	  root.add(instructions);
	  instructions.add(openingDoc);
	  instructions.add(editingDoc);
	  openingDoc.add(openingDocText);
	  editingDoc.add(editingDocText);
	  return new DefaultTreeModel(root);
  }
  private DefaultMutableTreeNode createTreeNode(Node root){
	  DefaultMutableTreeNode treeNode=null;
	  String type,name,value;
	  NamedNodeMap attribs;
	  Node attribNode;
	  type=getNodeType(root);
	  name=root.getNodeName();
	  value=root.getNodeValue();
	  treeNode=new DefaultMutableTreeNode(root.getNodeType()==Node.TEXT_NODE?value:name);
	  attribs=root.getAttributes();
	  if(attribs!=null){
		  for(int i=0;i<attribs.getLength();i++){
			  attribNode=attribs.item(i);
			  name=attribNode.getNodeName().trim();
			  value=attribNode.getNodeValue().trim();
			  if(value!=null){
				  if(value.length()>0){
					  treeNode.add(new DefaultMutableTreeNode("[Attribute]-->"+name+"=\""+value+"\""));
				  }
			  }
		  }
	  }
	  if(root.hasChildNodes()){
		  NodeList children;
		  int numChildren;
		  Node node;
		  String data;
		  children=root.getChildNodes();
		  if(children!=null){
			  numChildren=children.getLength();
			  for(int i=0;i<numChildren;i++){
				  node=children.item(i);
				if(node!=null){
					if(node.getNodeType()==Node.ELEMENT_NODE){
						treeNode.add(createTreeNode(node));
					}
					data=node.getNodeValue();
					if(data!=null){
						data=data.trim();
						if(!data.equals("\n")&&!data.equals("\r\n")&&data.length()>0){
							treeNode.add(createTreeNode(node));
						}
					}
				}
			  }
		  }
	  }
	  return treeNode;
  }
  private String getNodeType(Node node){
	  String type;
	  switch(node.getNodeType()){
	  case Node.ELEMENT_NODE:
	  {
		  type="Element";
		  break;
	  }
	  case Node.ATTRIBUTE_NODE:
	  {
		  type="Attribute";
		  break;
	  }
	  case Node.TEXT_NODE:
	  {
		  type="Text";
		  break;
	  }
	  case Node.CDATA_SECTION_NODE:
	  {
		  type="CData section";
		  break;
	  }
	  case Node.ENTITY_NODE:
	  {
		  type="Entity";
		  break;
	  }
	  case Node.PROCESSING_INSTRUCTION_NODE:
	  {
	  type = "Processing instruction";
	  break;
	  }
	  case Node.COMMENT_NODE:
	  {
	  type = "Comment";
	  break;
	  }
	  case Node.DOCUMENT_NODE:
	  {
	  type = "Document";
	  break;
	  }
	  case Node.DOCUMENT_TYPE_NODE:
	  {
	  type = "Document type";
	  break;
	  }
	  case Node.DOCUMENT_FRAGMENT_NODE:
	  {
	  type = "Document fragment";
	  break;
	  }
	  case Node.NOTATION_NODE:
	  {
	  type = "Notation";
	  break;
	  }
	  default:
	  {
	  type = "???";
	  break;
	  }

	  }
	  return type;
  }
  private Node parseXml( String text )
  {
  ByteArrayInputStream byteStream;
  byteStream = new ByteArrayInputStream( text.getBytes() );
  try
  {
  doc = db.parse( byteStream );
  }
  catch ( Exception e )
  {
  e.printStackTrace();
  System.exit(0);
  }
  return ( Node )doc.getDocumentElement();
  }
  
  
  
  
  
}
import javax.swing.*;
import javax.swing.tree.TreeSelectionModel;
import javax.xml.parsers.ParserConfigurationException;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
public class XmlEditor extends JFrame
{

private XTree xTree;

private JScrollPane jScroll,jScrollRt;
private JTextArea textArea;
private JSplitPane splitPane;
private JButton refreshButton;
private WindowListener winClosing;

private static final int FRAME_WIDTH = 400;
private static final int FRAME_HEIGHT = 300;
public XmlEditor( String title ) throws ParserConfigurationException
{
super( title );
Toolkit toolkit;
Dimension dim, minimumSize;
int screenHeight, screenWidth;


setBackground( Color.lightGray );
getContentPane().setLayout( new BorderLayout() );
toolkit = Toolkit.getDefaultToolkit();
dim = toolkit.getScreenSize();
screenHeight = dim.height;
screenWidth = dim.width;
setBounds( (screenWidth-FRAME_WIDTH)/2, (screenHeight-FRAME_HEIGHT)/2, FRAME_WIDTH, FRAME_HEIGHT );
jScroll = new JScrollPane();
jScrollRt = new JScrollPane();
textArea = new JTextArea( 200,150 );
jScrollRt.getViewport().add( textArea );
xTree = new XTree();
xTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
xTree.setShowsRootHandles( true );
xTree.setEditable( false );
jScroll.getViewport().add( xTree );
splitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, jScroll, jScrollRt );
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(200);
minimumSize = new Dimension(200, 150);
jScroll.setMinimumSize( minimumSize );
jScrollRt.setMinimumSize( minimumSize );
splitPane.setPreferredSize( new Dimension(400, 300) );
getContentPane().add( splitPane, BorderLayout.CENTER );

refreshButton = new JButton( "Refresh" );
refreshButton.setBorder(
BorderFactory.createRaisedBevelBorder() );
refreshButton.addActionListener( new RefreshAction());
getContentPane().add( refreshButton, BorderLayout.NORTH );
JMenu fileMenu = new JMenu( "File" );
JMenuItem exitItem = new JMenuItem( "Exit" );
fileMenu.add( exitItem );
JMenuBar menuBar = new JMenuBar();

menuBar.add( fileMenu );
setJMenuBar( menuBar );
exitItem.addActionListener(new exitMenuHandler());
validate();
setVisible(true);
winClosing = new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
exit();
}
};
addWindowListener(winClosing);
}
public XmlEditor( String title, ArrayList xmlText ) throws
ParserConfigurationException
{
 this( title );
 textArea.setText( ( String )xmlText.get( 0 ) + "\n" );
 for ( int i = 1; i < xmlText.size(); i++ )
 textArea.append( ( String )xmlText.get( i ) + "\n" );
 xTree.refresh( textArea.getText() );
}

public static void main( String[] args )
{
String fileName = "DocBook.xml";
BufferedReader reader;
String line;
ArrayList xmlText = null;
XmlEditor xmlEditor;
try
{
//if( args.length > 0 )
//{
//fileName = args[0];
if ( fileName.substring( fileName.indexOf( '.' ) ).equals( ".xml" ) )
{
reader = new BufferedReader( new FileReader( fileName ) );
xmlText = new ArrayList();
while ( ( line = reader.readLine() ) != null )
{
xmlText.add( line );
}
reader.close();
xmlEditor = new XmlEditor( "XmlEditor 1.0", xmlText );
}
else
{
help();
}
//}
//else
//{
//xmlEditor = new XmlEditor( "XmlEditor 1.0" );
//}
}
catch( FileNotFoundException fnfEx )
{
System.out.println( fileName + " was not found." );
exit();
}
catch( Exception ex )
{
ex.printStackTrace();
exit();
}
}


private static void help()
{
System.out.println( "\nʹ这样输入java XTreeTester yourxmlfilename.xml" );
System.exit(0);
}
// �˳�
private static void exit()
{
System.out.println( "\n这样输入 XTree" );
System.exit(0);
}
class RefreshAction implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent ae) {
		// TODO Auto-generated method stub
		if ( ae.getActionCommand().equals( "Refresh" ) )
			 xTree.refresh( textArea.getText() );

	}
	
}

class newMenuHandler implements ActionListener
{
 public void actionPerformed ( ActionEvent ae )
 {
//	 textArea.setText( "" );
//	 try { // 创建一个新的XTree
//	 xTree = new XTree();
//	 xTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
//	xTree.setShowsRootHandles( true );
//	// 这个工具更高级的版本,允许修改JTree
//	 xTree.setEditable( false);
//	 }
//	 //catch ( Exception ex ){
//	//ex.printStackTrace();
//
//
//	}  
	 textArea.setText("");
	 try {
		 xTree = new XTree();
		 xTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
		xTree.setShowsRootHandles( true );
		// 这个工具更高级的版本,允许修改JTree
		 xTree.setEditable( false);
	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
	}
	 
} 
}
class openMenuHandler implements ActionListener
{
 JFileChooser jfc;
Container parent;
int choice;
Component openItem;
 openMenuHandler()
 {
 super();
 jfc = new JFileChooser();
 jfc.setSize( 400,300 );
 jfc.setFileFilter( new XmlFileFilter() );
 
parent = openItem.getParent(); 
 }
 public void actionPerformed( ActionEvent ae )
 {
 choice = jfc.showOpenDialog( parent );
 if ( choice == JFileChooser.APPROVE_OPTION )
 {
 String fileName, line;
 BufferedReader reader;
 fileName = jfc.getSelectedFile().getAbsolutePath();
 try
 {
 reader = new BufferedReader(
 new FileReader( fileName ) );
 textArea.setText( reader.readLine() + "\n" );
 while ( ( line = reader.readLine() ) != null )
 {
 textArea.append( line + "\n" );
 }
 reader.close();
 xTree.refresh( textArea.getText() );
 }catch ( Exception ex )
 {
 String message = ex.getMessage();
 ex.printStackTrace();
}
jfc.setCurrentDirectory( new File( fileName ) );}
}
}
class saveMenuHandler implements ActionListener
 {
 JFileChooser jfc;
 Container parent;
 int choice;
 Component saveItem;
saveMenuHandler()
 {
 super();
 jfc = new JFileChooser();
 jfc.setSize( 400,300 );
 jfc.setFileFilter( new XmlFileFilter() );

parent = saveItem.getParent();
}
public void actionPerformed( ActionEvent ae )
{
 choice = jfc.showSaveDialog( parent );
 if ( choice == JFileChooser.APPROVE_OPTION )
 {
 String fileName;
File fObj;
 FileWriter writer;
 fileName = jfc.getSelectedFile().getAbsolutePath();
try {
 writer = new FileWriter( fileName );
 textArea.write( writer );
 writer.close();
 }
 catch ( IOException ioe )
 {
 ioe.printStackTrace();
 }
 jfc.setCurrentDirectory( new File( fileName ) );}
}
}
class exitMenuHandler implements ActionListener
{
 public void actionPerformed( ActionEvent ae ) {
 exit();
 }
}
class XmlFileFilter extends javax.swing.filechooser.FileFilter
{
 public boolean accept( File fobj )
 {
 if ( fobj.isDirectory() )
 return true;
 else
 return fobj.getName().endsWith( ".xml" );
 }
public String getDescription()
{
 return "*.xml";
}
}
}



 

 运行结果为

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值