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(); } }
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();
}
}
但是commentToElement(Comment comment)这个方法似乎有些不妥,不知道你如何构造参数中的这个comment?用整个element的字符串构造?
之前很少用Dom4j的但是你这里所谓的反注释,总不会是想把Document里的所有注释变成Element吧
总该需要指定一个需要被反注释的区域啊
等我再看看如何使用
对原来的转化方法做了修改
且加上了如何取得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]");
经过仔细想了一番,Dom4J没有实现这个功能也是有它的道理的!
注释掉一个element好办,但是反注释确是很难,因为根本不可能用类似/Server/Service/Connector
这样的xpath来定位到想要反注释的这个节点.用 comment()[1]这种方法又太不灵活,试想一个较长的XML文档经过一系列节点以及注释的增增删删以后,这个位置可能早都变了.
而且正如zcjl()说的一样
//把下面这行注释去掉,就会出现异常,因为无法把test for comment转化为Element
//root.addComment("test for comment");
commentToElement(Comment comment)方法还是存在它不能解决的问题.但是这个问题又是不可避免的!
不管怎么样,同样谢谢zcjl() :)
其实我对dom4j的使用也不是很了解
所以才动手去试了一下