以前java 解析 xml 文件的时候,使用最古老sax的方法,异常的麻烦!后来接触到了dom4j 这个家伙,无聊之时尝试的去用了一下,感觉真的很好用,如果说使用sax解析xml 是相当于纯js写代码,那么dom4j 就相当于 jQuery框架这么好用。
package chenluozhi;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultElement;
/**
* dom4j 解析文档测试
* @author 陈罗志
* @date 2011-10-24 需要引入包:jaxen-1.1.jar、dom4j-1.6.1.jar
*
*/
public class SAXReaderTest {
private static Log logger = LogFactory.getLog(SAXReaderTest.class);
public SAXReaderTest() {
}
/**
* 读取xml文件属性以及内容(请确保xml文件为UTF-8格式)
*
* @param file
*/
@SuppressWarnings("unchecked")
public static void readXML(File file) {
SAXReader reader = new SAXReader();
Document document;
try {
//xml 文件含有中文,一定要设置编码,否则报错
reader.setEncoding("GBK");
document = reader.read(file);
// 使用xpath表达式匹配节点
String title = document.selectSingleNode("/root/title").getText();
String visual = document.selectSingleNode("/root/title/@visual").getText();
String nodeName = document.selectSingleNode("/root/title").getName();
System.out.println("元素名称为:"+nodeName+" 内容:"+title+" 里边的visual 属性:"+visual);
// 获取 view/form节点下的所有(注意"//") dataItem 节点列表
List<DefaultElement> dataItems = document.selectNodes("/root/form//dataItem");
List<Attribute> attr_dataItems = document.selectNodes("/root/form//dataItem/@name");
System.out.println("现在开始遍历form元素下的所有name属性");
for(Attribute attr:attr_dataItems){
System.out.println("属性值为:"+attr.getValue());
}
// 循环dataItem节点组,把每一个节点的属性以及内容打印出来
// for (int i = 0; i < dataItems.size(); i++) {
//
// String name = dataItems.get(i).selectSingleNode("./@name")
// .getText();
//
// String label = dataItems.get(i).selectSingleNode("./@label")
// .getText();
// String content = dataItems.get(i).getText();
//
//
// System.out.println(name);
// System.out.println(label);
// System.out.println(content);
// }
//学会习惯这种写法,除非你要准确知道目前遍历到哪个元素
for (DefaultElement d:dataItems) {
String name = d.selectSingleNode("./@name")
.getText();
String label = d.selectSingleNode("./@label")
.getText();
String content = d.getText();
System.out.println(name);
System.out.println(label);
System.out.println(content);
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 创建xml文件
* @param fileName
* @fileName 需建立的文件名
* @return 返回操作结果, false表失败, true表成功
*/
public static boolean createXML(File fileName) {
boolean result = false;// 返回操作结果
Document document = DocumentHelper.createDocument();// 建立document对象
Element dom4jElement = document.addElement("root"); // 建立XML文档的根books
dom4jElement.addComment("dom4j创建xml文件测试!"); // 加入一行注释
Element titleElement = dom4jElement.addElement("title"); // 加入title节点
titleElement.setText("dom4j创建xml测试标题!");
titleElement.addAttribute("visual","true");
Element formElement = dom4jElement.addElement("form"); // 加入第一个form节点
formElement.addAttribute("visual","true");//设置属性
Element dataElement = formElement.addElement("dataItem");
dataElement.addAttribute("name", "第一个name属性名称"); // 加入name属性内容
dataElement.addAttribute("label", "第一个label属性名称"); // 加入label属性内容
dataElement.setText("标签一内容");
Element dataElement1 = formElement.addElement("dataItem");
dataElement1.addAttribute("name", "第二个name属性名称"); // 加入name属性内容
dataElement1.addAttribute("label", "第二个label属性名称"); // 加入label属性内容
dataElement.setText("标签二内容");
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(
new FileWriter(fileName), format);
writer.write(document);
writer.close();
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 修改XML 文件
* @param oleFileName 输入源文件名称
* @param newFileName 输出文件名称
*/
public static boolean modifyXML(File oleFileName,File newFileName){
boolean result = false;// 返回操作结果
SAXReader reader = new SAXReader();
reader.setEncoding("GBK");
try {
//把文件读入内存
Document document = reader.read(oleFileName);
DefaultElement element = (DefaultElement) document.selectSingleNode("/root/title");
element.setName("title_modifiy");
element.addAttribute("visual", "modify");
element.setText("content be modify!");
//选择一组元素
List<DefaultElement> elementList = document.selectNodes("/root/form//dataItem");
for(DefaultElement d:elementList){
//把这一组元素内容都修改了
d.setText("modify content!!!");
}
//根据属性选择特定一个元素
DefaultElement special = (DefaultElement)document.selectSingleNode("/root/form//dataItem[@name='第二个name属性名称']");
special.setText("special modify!!!");
//太诡异了,要这样删除属性的
special.remove(special.attribute("label"));
//删除节点,应该先处于在父节点的位置然后删除子节点!
special.getParent().remove(special);
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(
new FileWriter(newFileName), format);
writer.write(document);
writer.close();
result = true;
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public static void main(String args[]) {
//"."代表当前目录;"/"代表根目录;这里文件路径为:s=\D:\Workspaces\MyTest\bin
String s= SAXReaderTest.class.getResource("/").getPath();
File file = new File(s+"config.xml");
File file1 = new File(s+"_config.xml");
createXML(file);
readXML(file);
modifyXML(file,file1);
}
}
/**
* 相关知识点
* Node<接口> Element<接口> Attribute<接口> 后两个接口继承前边那个接口
* dom4j api:http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/
*/