想用swing界面来  实现对一个xml文件的增删改查首先将一个xml文件的各个节点的值显示出来  并提供增删改查的按钮由于以前没有接触过swing  希望大家帮忙  怎么实现啊?

解决方案 »

  1.   

    package xmls.log;/**用xml文档记录登陆信息的一个主要类
     *关于xml操作的例子
     */import javax.swing.*;
    import java.io.File;
    import javax.swing.tree.*;
    import javax.xml.parsers.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.*;public class LogRecorder{//日志记录 private static final long serialVersionUID = 1l;

    private DocumentBuilderFactory dbf = null;//XML文档构建工厂
    private DocumentBuilder db = null;//XML文档构建器
    private Document doc = null;//XML文档

    private DefaultMutableTreeNode dmtn = null;//树状视图的节点
    private JTree tree = null;//树状视图

    private String userDir = System.getProperty("user.dir");//当前程序所在的目录
    private boolean isSuccess = false;

    public boolean isLogRecorder(String filePath,String time,String name){

    try{

    // 创建XML文档构建工厂
    dbf = DocumentBuilderFactory.newInstance(); // 允许解析名称空间
    //dbf.setNamespaceAware(true); // 创建XML文档构建器
    db = dbf.newDocumentBuilder(); // 获取XML文档
    //System.out.println("当前用户的工作目录:"+System.getProperty("user.home")+"\n当前程序所在目录:"+System.getProperty("user.dir"));
    File f = new File(userDir+filePath);//文件路径
    //System.out.print("file:"+userDir+filePath);
    doc = db.parse(f);

    // 规范化XML文档
    doc.normalize();
    /*
    }catch(Exception e){

    JOptionPane.showMessageDialog(null,e.toString()+"  1","ERROR",JOptionPane.ERROR_MESSAGE);
    }
    */

    //获取根结点
    Node elm = doc.getDocumentElement();

    //给树状图添加根结点
    dmtn = new DefaultMutableTreeNode(elm.getNodeName());

    //给树状图添加子结点
    addChildNodes(dmtn,elm);

    //创建树
    tree = new JTree(dmtn);
    //在第一行添加
    int selRow  = 1;//tree.getRowForLocation(30,24);
    tree.setSelectionRow(selRow);

    //获取树状视图的选择路径
    TreePath tp = tree.getSelectionPath(); //获取树状视图选择路径的最后一个节点
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent();

    //如果选中了有效的"log"节点
    if (/*selRow != -1 && */node.toString().equals("log") && node.getParent() != null)
    //插入结点
    insertXML(filePath,time,name);
    //插入成功
    isSuccess = true;

    }catch(Exception e){

    JOptionPane.showMessageDialog(null,e.toString(),"ERROR",JOptionPane.ERROR_MESSAGE);
    }
    return isSuccess;
    }

    public void insertXML(String filePath,String time,String name){

    //创建XML元素节点
    Element elmLog = doc.createElement("log");
    Element elmTime = doc.createElement("time");
    Element elmName = doc.createElement("name");


    //创建XML文本节点
    Text txtTime = doc.createTextNode(time);
    Text txtName = doc.createTextNode(name); //添加XML节点
    elmTime.appendChild(txtTime);
    elmName.appendChild(txtName);
    elmLog.appendChild(elmTime);
    elmLog.appendChild(elmName); //获取树状视图的选择路径
    TreePath tp = tree.getSelectionPath(); //获取树状视图选择路径的最后一个节点
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent(); //获取树状视图所选节点的"time"子节点内容
    String currentTime = node.getChildAt(0).getChildAt(0).toString(); //获取所有的"time"子节点
    NodeList nl = doc.getElementsByTagName("time"); //在节点列表中搜索与当前树状视图所选节点"time"子节点内容一样的元素
    for(int i = 0; i < nl.getLength(); i++){
    //获取"time"子节点的值
    Node subNode = nl.item(i).getChildNodes().item(0); //如果一样
    if(subNode.getNodeValue().equals(currentTime)){
    //获取XML根节点
    Node parentNode = subNode.getParentNode().getParentNode(); //插入新的log节点
    parentNode.getParentNode().insertBefore(elmLog,parentNode); //规范化XML文档
    doc.normalize(); try{
    //创建转换工厂类
    TransformerFactory tFactory = TransformerFactory.newInstance(); //创建转换类
    Transformer transformer = tFactory.newTransformer(); //创建DOM源
    DOMSource source = new DOMSource(doc); //创建XML的输出结果流
    StreamResult result = new StreamResult(
    new java.io.File(userDir + filePath)); //利用DOM更新XML文件
    transformer.transform(source, result);
    }catch (Exception e){

    JOptionPane.showMessageDialog(null,e.toString(),"ERROR",JOptionPane.ERROR_MESSAGE);
    }
    //System.out.println("a");
    break;
    }//end if
    }//end for

    //获取树状视图的模型
    //DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel(); //在树状视图中添加新的节点
    DefaultMutableTreeNode logDmtn = new DefaultMutableTreeNode(elmLog.getNodeName());
    DefaultMutableTreeNode timeDmtn = new DefaultMutableTreeNode(elmTime.getNodeName());
    DefaultMutableTreeNode nameDmtn = new DefaultMutableTreeNode(elmTime.getNodeName());
    DefaultMutableTreeNode timeValueDmtn = new DefaultMutableTreeNode(txtTime.getNodeValue());
    DefaultMutableTreeNode nameValueDmtn = new DefaultMutableTreeNode(txtName.getNodeValue());
    timeDmtn.add(timeValueDmtn);
    nameDmtn.add(nameValueDmtn);
    logDmtn.add(timeDmtn);
    logDmtn.add(nameDmtn); //在树状视图插入子节点
    dmtn.insert(logDmtn, dmtn.getIndex(node)); //重新生成新的树状视图
    tree = new JTree(dmtn);
    }

    //在树状视图中添加子节点的函数
    public void addChildNodes(DefaultMutableTreeNode superDmtn, Node nodeName){
    //获取当前节点的子节点列表
    NodeList nl = nodeName.getChildNodes(); //循环遍历子节点列表
    for(int i = 0; i < nl.getLength(); i++){
    //得到一个子节点
    Node node = nl.item(i); //如果不是文本子节点类型
    if(node.getNodeType() != Node.TEXT_NODE){
    // 创建树状视图的新子节点
    DefaultMutableTreeNode subdmtn = new DefaultMutableTreeNode(node.getNodeName());
    superDmtn.add(subdmtn); //如果还有子节点,递归添加下级子节点
    if(node.hasChildNodes()){
    addChildNodes(subdmtn, node);
    }
    }
    //如果是文本子节点类型,并且文本内容不为空
    else if(!node.getNodeValue().trim().equals("")){
    //将当前节点添加为树状视图的叶节点
    DefaultMutableTreeNode subdmtn = new DefaultMutableTreeNode(node.getNodeValue());
    superDmtn.add(subdmtn);
    }
    }
    }
    }