既然没有现成的api,就自己实现好了把需要注释的Element转换成String,然后把这个String添加成注释,然后从Document中删掉那个Element

解决方案 »

  1.   

    随便写了一点,将就着看就是了,没有经过仔细测试
      
        public static void elementToComment(Element element) {
            String value = element.asXML();
            Element parent = element.getParent();
            parent.addComment(value);
            List content = parent.content();
            Comment comment = (Comment) content.get(content.size() - 1);
            int index = content.indexOf(element);
            content.set(index, comment);
            content.remove(content.size() - 1);
            parent.setContent(content);
        }
        
        public static void commentToElement(Comment comment) {
            try {
                String value = comment.asXML();
                Document doc = DocumentHelper.parseText(value);
                Element element = doc.getRootElement();
                Element parent = comment.getParent();
                List content = parent.content();
                int index = content.indexOf(comment);
                content.set(index, element);
                parent.setContent(content);       
            } catch (Exception e) {
                throw new IllegalArgumentException();
            }
        }
      

  2.   

    谢谢 zcjl() ,elementToComment(Element element)这个方法是可行的,
    但是commentToElement(Comment comment)这个方法似乎有些不妥,不知道你如何构造参数中的这个comment?用整个element的字符串构造?
      

  3.   

    我昨天写的时候,发现也取不到Comment对象,真是郁闷死了
    之前很少用Dom4j的但是你这里所谓的反注释,总不会是想把Document里的所有注释变成Element吧
    总该需要指定一个需要被反注释的区域啊
    等我再看看如何使用
      

  4.   

    下面是稍微改动过一些的程序
    对原来的转化方法做了修改
    且加上了如何取得Comment对象的test代码
        public static void elementToComment(Element element) {
            String value = element.asXML();
            Element parent = element.getParent();
            parent.addComment(value);
            List content = parent.content();
            Comment comment =
                (Comment) ((Comment) content.get(content.size() - 1)).clone();
            int index = content.indexOf(element);
            content.set(index, comment);
            content.remove(content.size() - 1);
        }    public static void commentToElement(Comment comment) {
            try {
                String value = comment.asXML();
                value = value.substring(4, value.length() - 3);
                Document doc = DocumentHelper.parseText(value);
                Element element = doc.getRootElement();
                Element parent = comment.getParent();
                List content = parent.content();
                int index = content.indexOf(comment);
                content.set(index, element);
            } catch (DocumentException e) {
                throw new IllegalArgumentException("不能把注释转化为合式的元素");
            }
        }    public static void main(String[] args) {
            Document doc = DocumentHelper.createDocument();
            Element root = doc.addElement("root");
            Element aaa = root.addElement("aaa");
            Element bbb = root.addElement("bbb");
            aaa.addText("value of aaa");
            System.out.println(doc.asXML());
            System.out.println();        elementToComment(aaa);
            System.out.println(doc.asXML());
            System.out.println();        //把下面这行注释去掉,就会出现异常,因为无法把test for comment转化为Element
            //root.addComment("test for comment");        
            
            List comments = root.selectNodes("comment()");
            for (Iterator it = comments.iterator(); it.hasNext();) {
                Comment comment = (Comment) it.next();
                commentToElement(comment);
            }
            System.out.println(doc.asXML());
        }如果只取其中的某一个或几个Comment来转换
    可以通过修改xpath完成,例如改为:
    List comments = root.selectNodes("comment()[1]");
    List comments = root.selectNodes("comment()[position() < 3]");
      

  5.   

    真是多谢zcjl()兄弟了,一定花了你好些时间!
    经过仔细想了一番,Dom4J没有实现这个功能也是有它的道理的!
    注释掉一个element好办,但是反注释确是很难,因为根本不可能用类似/Server/Service/Connector
    这样的xpath来定位到想要反注释的这个节点.用 comment()[1]这种方法又太不灵活,试想一个较长的XML文档经过一系列节点以及注释的增增删删以后,这个位置可能早都变了.
    而且正如zcjl()说的一样
    //把下面这行注释去掉,就会出现异常,因为无法把test for comment转化为Element
            //root.addComment("test for comment");    
    commentToElement(Comment comment)方法还是存在它不能解决的问题.但是这个问题又是不可避免的!
    不管怎么样,同样谢谢zcjl() :)
      

  6.   

    呵呵
    其实我对dom4j的使用也不是很了解
    所以才动手去试了一下