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即可,试试吧!
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即可,试试吧!