/* * 系统名称: QuickBundle --> rmdemo * * 文件名称: org.quickbundle.tools.support.tree --> RmXmlHelper.java * * 功能描述: * * 版本历史: 2005-11-19 19:16:49 创建1.0.0版 (baixiaoyong) * */ package org.quickbundle.tools.support.tree; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.util.Iterator; import java.util.List; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.DocumentSource; import org.quickbundle.project.init.RmConfig; /** * 功能、用途、现存BUG: * * @author 白小勇 * @version 1.0.0 * @see 需要参见的其它类 * @since 1.0.0 */ public class DeepTreeXmlHandler { /** * document 表示: xml的母体 */ private Document document; /** * 功能: 获得xml的String表示 * * @return */ public String getStringFromDocument() { selfCheckHasChild4HardTree(); ByteArrayOutputStream bytesStream = new ByteArrayOutputStream(); BufferedOutputStream outer = new BufferedOutputStream(bytesStream); TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = null; try { transformer = tFactory.newTransformer(); transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, RmConfig.defaultEncode()); transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes"); transformer.transform(new DocumentSource(this.document), new StreamResult(outer)); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } String returnValue = ""; try { returnValue = bytesStream.toString(RmConfig.defaultEncode()); } catch (Exception e1) { e1.printStackTrace(); } return returnValue; } /** * 构造函数: 初始化document,并加入根元素"Trees" * */ public DeepTreeXmlHandler() { document = DocumentHelper.createDocument(); document.addElement("Trees"); } /** * 功能: 加DeepTreeVo节点到根元素 * * @param dtv 要加入的树节点 * @return */ public Element addTreeNode(DeepTreeVo dtv) { Element root = document.getRootElement(); Element treeNodeVo = root.addElement("TreeNode"); for(Iterator itMapAttribute = dtv.getAttributeMapIterator(); itMapAttribute.hasNext(); ) { String tempKey = itMapAttribute.next().toString(); String tempValue = dtv.getAttribute(tempKey); treeNodeVo.addAttribute(tempKey, tempValue); } return treeNodeVo; } /** * 功能: 加DeepTreeVo节点到id为id值的元素,如果不存在返回空 * * @param id 父节点id * @param dtv 要加入的树节点 * @return 成功则返回这个树节点的Element,失败则返回null */ public Element addTreeNode(String parentId, DeepTreeVo dtv) { if(parentId == null) { return null; } else { Element thisParentTreeNode = (Element) document.selectSingleNode("//TreeNode[@id='" + parentId + "']"); if(thisParentTreeNode == null) { return null; } Element thisTreeNode = thisParentTreeNode.addElement("TreeNode"); for(Iterator itMapAttribute = dtv.getAttributeMapIterator(); itMapAttribute.hasNext(); ) { String tempKey = itMapAttribute.next().toString(); String tempValue = dtv.getAttribute(tempKey); thisTreeNode.addAttribute(tempKey, tempValue); } return thisTreeNode; } } /** * 功能: 加DeepTreeVo节点到id为id值的元素,如果parentId为null或parentId为""则加到id为defaultRootId的元素 * * @param id 父节点id * @param dtv 要加入的树节点 * @param defaultRootId * @return 成功则返回这个树节点的Element,失败则返回null */ public Element addTreeNode(String parentId, DeepTreeVo dtv, String defaultRootId) { Element rtElement = null; if(parentId != null && parentId.length() > 0) { rtElement = addTreeNode(parentId, dtv); } if(rtElement == null) { rtElement = addTreeNode(defaultRootId, dtv); } return rtElement; } /** * 功能: 自我修复不良数据,把没有子节点,并且xmlSource等于tempTreeNode"",并且hasChild等于"1"的节点的hasChild="0" * * @return 返回修复的节点数 */ public int selfCheckHasChild4HardTree() { List lTreeNode = this.document.selectNodes("//TreeNode[not(./TreeNode) and @xmlSource='' and @hasChild='1']"); for(Iterator itLTreeNode = lTreeNode.iterator(); itLTreeNode.hasNext(); ) { Node tempTreeNode = (Node) itLTreeNode.next(); Node hasChild = tempTreeNode.selectSingleNode("@hasChild"); hasChild.setText("0"); } return lTreeNode.size(); } public static void main(String[] args) { DeepTreeXmlHandler dt = new DeepTreeXmlHandler(); dt.addTreeNode(new DeepTreeVo("1", "销售部", "1", "xmlData.xml")); dt.addTreeNode(new DeepTreeVo("2", "开发中心", "1", "xmlData.xml")); System.out.println(dt.getStringFromDocument()); } }