之前做HTML的解析的时候用过jsoup,做XML的解析的时候用过SAX。最近在做XML的修改的时候,突然发现,jsoup不太支持XML,而SAX也不支持XML文档的修改。
在网上查找了一番之后,发现针对XML,Java有4种技术可以对其进行CRUD:DOM、JDOM、DOM4J、SAX。对这四种技术的比较如下:
http://blog.youkuaiyun.com/shijinupc/article/details/7653945
通过对比可以发现,在需要修改现有XML文档的场合,DOM4J是最优的选择。对于DOM4J,如下的链接可以作为学习的参考:
http://blog.youkuaiyun.com/icecloud/article/details/7795
总的来说,DOM4J对XML的操作有如下几个步骤:
1. 创建新的(DocumentHelper.createDocument)或打开现有的(newSAXReader().read)XML文档
2. 通过Element接口对XML文档的元素进行CRUD操作
3. 若有修改,则在最后通过XMLWriter对象的write方法,将Document对象写入相应的文件中
而我在应用,遇到了一个问题,是该学习资料中没有讲到的:即,如何在指定的位置插入标签?同样在我网上搜索一番之后,按照如下两篇博文的思路即可解决问题:
http://blog.youkuaiyun.com/mingjian_zheng/article/details/4730202
http://www.360doc.com/content/12/0210/14/2795334_185550227.shtml
实际上,DOM4J中并没有直接提供在指定位置插入标签的方法,任何的add操作都是插入到最后面。但是,DOM4J是允许获取某个标签的子标签或属性集合列表(List)的,并且对该列表的修改可以直接反应到文档对象Document中。也就是说,假如对该列表进行修改,那么最后通过XMLWriter输出Document对象时,做出的修改也会被输出,从而完成对指定位置元素的修改。
如下的代码是在XML文档指定位置(persistence-unit标签下的provider标签之后)插入新标签(class标签)的应用,可做参考:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Test {
public static void main(String[] args) throws DocumentException, IOException {
String filename = "src/META-INF/persistence.xml";
Document doc = new SAXReader().read(new File(filename));
Element root = doc.getRootElement();
Element unit = root.element("persistence-unit");
@SuppressWarnings("unchecked")
List<Element> elements = unit.elements();
Element clazz = root.addElement("class");
clazz.setText("cn.ibm.com.entity.Person");
root.remove(clazz);
int i = 0;
for (; i < elements.size(); i++) {
Element e = elements.get(i);
if (e.getName().equals("provider")) {
break;
}
}
elements.add(i + 1, clazz);
XMLWriter writer = new XMLWriter(new FileWriter(filename));
writer.write(doc);
writer.close();
System.out.println("done");
}
}