在myFaces中有個(gè)標(biāo)簽為<x:tree>,使用這個(gè)標(biāo)簽可以在頁(yè)面上顯示一個(gè)動(dòng)態(tài)的樹(shù)形結(jié)果,效果類似于資源管理器。
本來(lái),這個(gè)標(biāo)簽的出現(xiàn)很容易讓人聯(lián)想到是為了顯示xml設(shè)計(jì)的,但是事實(shí)上要用這個(gè)標(biāo)簽去顯示xml文件并非如此容易的。
在myFaces提供的demo中,<x:tree>標(biāo)簽中用到的數(shù)據(jù)都是事先硬編碼到程序中的。但是如果要顯示xml文件卻沒(méi)有那么簡(jiǎn)單。文件不同,xml的結(jié)構(gòu)也不同,顯示的內(nèi)容也不同。這樣就需要在每次顯示xml文件的時(shí)候都重構(gòu)一個(gè)<x:tree>支持的結(jié)構(gòu)。<x:tree>支持的結(jié)構(gòu)為DefaultMutableTreeNode。
將一個(gè)xml文件轉(zhuǎn)化為DefaultMutableTreeNode結(jié)構(gòu)的過(guò)程如下。
我們得到的是一個(gè)w3c的document,其中包含了xml文件的內(nèi)容。
一,將w3c的document轉(zhuǎn)成jdom的document
public static DefaultMutableTreeNode readDom(Document domDoc){
//w3cドキュメントをjdomドキュメントに転換する。
DOMBuilder builder = new DOMBuilder();
org.jdom.Document jdomDoc = builder.build(domDoc);
Element parent = jdomDoc.getRootElement();
//表示のトリーを構(gòu)築する。
DefaultMutableTreeNode root = accessElement(parent,null);
return root ;
}
在這個(gè)方法里面將w3c的document轉(zhuǎn)成了jdom的document,然后使用accessElement方法進(jìn)行document到DefaultMutableTreeNode結(jié)構(gòu)的轉(zhuǎn)換。
private static DefaultMutableTreeNode accessElement(Element parent,DefaultMutableTreeNode nodeTree)
{
if(nodeTree==null){
nodeTree = new DefaultMutableTreeNode(CombineElementAttr(parent));
}
List listChild = parent.getChildren();
int iChild = listChild.size();
if(iChild==0){
if(parent.getContent().size()>0){
//elementの內(nèi)容を取得する。
DefaultMutableTreeNode node = new DefaultMutableTreeNode(CombineContent(parent));
//System.out.println(CombineContent(parent));
nodeTree.insert(node);
}
}else{
//サブノードのdomのelementを取得する。
for(int i = 0;i < iChild;i++)
{
Element e = (Element)listChild.get(i);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(CombineElementAttr(e));
//System.out.println(CombineElementAttr(e));
nodeTree.insert(node);
//遞歸,將字節(jié)點(diǎn)增加到nodeTree中去
accessElement(e,node);
}
}
return nodeTree;
}
在accessElement方法中出現(xiàn)的CombineElementAttr是將元素中的屬性合并到一個(gè)字符串中,用于最終的顯示。具體實(shí)現(xiàn)如下:
private static String CombineElementAttr(Element ele){
StringBuffer eleString = new StringBuffer("<");
eleString.append(ele.getName()).append(" ");
List attr = ele.getAttributes();
for(Iterator iter = attr.iterator();iter.hasNext();){
Attribute attrElement = (Attribute)iter.next();
eleString.append(attrElement.getName())
.append("=")
.append("\"")
.append(attrElement.getValue())
.append("\"")
.append(" ");
}
eleString.append("/>");
return eleString.toString();
}
在accessElement方法中出現(xiàn)的CombineContent是將內(nèi)容合并到一個(gè)字符串中,用于最終的顯示。具體實(shí)現(xiàn)如下:
private static String CombineContent(Element ele){
StringBuffer eleString = new StringBuffer();
List contentList = ele.getContent();
for(Iterator iter = contentList.iterator();iter.hasNext();){
Content content = (Content)iter.next();
eleString.append(content.getValue()).append(" ");
}
return eleString.toString().trim();
}
這樣子,通過(guò)調(diào)用最上面的readDom方法,返回一個(gè)DefaultMutableTreeNode結(jié)構(gòu)的數(shù)據(jù),就可以用在<x:tree>中顯示了。