欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SWT中利用Treeview来显示XML文件 博客分类: eclipse&RCP xmlswttreevieweclipse 

程序员文章站 2024-02-25 09:02:28
...
最近一个项目需要在SWT界面上来对xml文件进行显示,但找了一下发现网上对在swing上显示有很多DEMO,但SWT这里却没有找到合适的,于是自动动手丰衣足食,下面我们来用 treeview来对XML文件进行显示,不多说,直接上代码,主要是标签管理器和内容管理器的:





1.标签管理器中主要取出当前节点的所有参数集合显示:

/**

*标签管理

*/

new LabelProvider() {
  
   public String getText(Object element) {
    if(element instanceof Node){
     //获取当前XML 节点中的参数集合map
           NamedNodeMap map = ((Node)element).getAttributes();
           if(map == null) return "" ;
     int length = map.getLength();
     //取得该节点的名称
     String str = ((Node)element).getNodeName() + "  " ;
     //循环取出所有的参数 包含名称和值
     for(int j = 0 ; j < length ; j++) {
     
      String values = map.item(j).getNodeName() + " =\"" + map.item(j).getFirstChild().getNodeValue() + "\"";
     
      str += values + " ";
     }
     return str;
          }
          
          return "";
   }
  }



2.内容管理器 主要是取出来当前节点的字节点和判断是否该XML节点包含有字节点



/**
   * 内容管理器
   */
  new ITreeContentProvider() {
  
   @Override
   public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    // TODO Auto-generated method stub
   
   }
  
   @Override
   public void dispose() {
    // TODO Auto-generated method stub
   
   }
  
   @Override
   public boolean hasChildren(Object element) {
   
    if(element instanceof Node) {
     Node node = (Node)element;
     if(node.hasChildNodes())
      return true;
    }
    
    return false;
   }
  
   @Override
   public Object getParent(Object element) {
    // TODO Auto-generated method stub
    return null;
   }
  
  
   @Override
   public Object[] getElements(Object inputElement) {
    System.out.println("########");
    return getChildren(inputElement);
   }
   @SuppressWarnings({ "rawtypes", "unchecked" })
   @Override
   public Object[] getChildren(Object parentElement) {
    //判断父节点是否为 XML中节点
    if(parentElement instanceof Node )
    {
     Node nodes = (Node)parentElement;
    
     List datas = new ArrayList();
    
     if (nodes != null) {
      //从第一个字节点开始遍历所有子节点,并且压入集合中
      for (Node n = nodes.getFirstChild(); n != null; n = n
       .getNextSibling()) {
      
       if(n != null && n.getNodeType() == Node.ELEMENT_NODE)
       
        datas.add(n);
       }
      return datas.toArray();
     }
   
     //如果为集合 则直接返回集合
    }else if(parentElement instanceof List) {
     return ((List)parentElement).toArray();
    }
//   
    return new Object[0];
   }
  }



3. treeview的input,初始化给传入xml文件中最高层的节点或同级最高的节点集合,直接上代码:



//设置input
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder;
  FileInputStream input = null;
  try {
   builder = factory.newDocumentBuilder();
   input = new FileInputStream(new File(path)); // path就是要解析的xml文件路径
   Document doc = builder.parse(input);
  
   //自动打开2级节点
   viewer.setAutoExpandLevel(2);
         viewer.setInput(doc.getChildNodes());
  } catch (ParserConfigurationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SAXException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   if(input != null)
    try {
     input.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  }



好了 到此我们就告一段落,不知道怎么去插图,所以放了DEMO到附件中,包含有实例文件等,直接import到eclipse即可,试试吧!