DOM4J是一个非常非常优秀的JavaXML API,是jdom的升级品,用来读写XML文件的,且具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
首先需要下载dom4j的jar包:dom4j 1.6.1。本篇文章需要引入dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar。
写xml
写xml文件非常简单,就是不停地在节点下添加子节点。
<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
* @Description: 写xml
*/
public class TestXmlWriter
{
public static void main(String[] args){
// XML 声明 <?xml version="1.0" encoding="UTF-8"?> 自动添加到 XML文档中
// 使用DocumentHelper类创建文档实例(生成 XML文档节点的 dom4j API工厂类)
Document doc=DocumentHelper.createDocument();
// addElement():创建根元素 items(用于向 XML 文档中增加元素)
Element rootElt=doc.addElement("items");
//在items节点下添加item节点
Element itemElt=rootElt.addElement("item");
//addAttribute()方法:在item节点内添加id和name属性
itemElt.addAttribute("id", "0001");
itemElt.addAttribute("name", "wanglp");
//在item节点下添加id元素
Element idElt=itemElt.addElement("id");
//设置id的值
idElt.setText("10023");
//在item节点下添加name元素
Element nameElt=itemElt.addElement("name");
//设置name的值
nameElt.setText("吉林省");
//打印xml内容
String xmlString=doc.asXML();
System.out.println(xmlString);
/*try
{
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); //设置xml文件编码的格式
//将xml写入test.xml文件中
XMLWriter writer=new XMLWriter(new FileWriter("h:\\test.xml"));
writer.write(doc);
writer.close();
System.out.println("写XML成功!");
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}</span>
读xml文件
xml文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<employees>
<!--An XML Note -->
<?target text?>
<employee id="lo" name="lele">
<sex>m</sex>
<age>23</age>
</employee>
<employee id="ve" name="fox">
<sex>f</sex>
<age>22</age>
</employee>
</employees> </span>
利用节点读取xml文件
<span style="font-family:KaiTi_GB2312;font-size:18px;">/**
* 利用dom4j进行xml文档的读取操作
*/
public void parserXml(File file) {
Document document = null;
// 使用 SAXReader 解析 XML 文档 catalog.xml:
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
// 将字符串转为XML
// document = DocumentHelper.parseText(fileString);
// 获取根节点
Element root = document.getRootElement();
// 打印节点名称
System.out.println("<" + root.getName() + ">"); //打印<employees>
// 获取根节点下的子节点遍历
Iterator<?> iter = root.elementIterator("employee");
// 遍历employee节点
while (iter.hasNext()) {
// 获取当前子节点
Element empEle = (Element) iter.next();
System.out.println("<" + empEle.getName() + ">"); //<employee>
// 获取当前子节点的属性遍历
Iterator<?> attrList = empEle.attributeIterator();
while (attrList.hasNext()) {
Attribute attr = (Attribute) attrList.next();
System.out.println(attr.getName() + "=" + attr.getValue()); //id=lo,,name=lele
}
// 遍历employee节点下所有子节点
Iterator<?> eleIte = empEle.elementIterator();
while (eleIte.hasNext()) {
Element ele = (Element) eleIte.next();
System.out.println("<" + ele.getName() + ">" + ele.getTextTrim()); //<sex>m ,,<age>23
}
// 获取employee节点下的子节点sex值
// String sex = empEle.elementTextTrim("sex");
// System.out.println("sex:" + sex);
}
System.out.println("</" + root.getName() + ">");
} </span>
根据字符串读取xml文件
这种方式读取xml文件时,xml文件中不能有重复的标签,也就是说我们需要将xml文件中的employee标签写成唯一。否则就会出错。
<span style="font-family:KaiTi_GB2312;font-size:18px;"> //这种方式读取xml文件,xml文件中不能有重复的标签
public void ReadXml(InputStream in){
SAXReader reader = new SAXReader();
try {
//读取配置文件
Document doc = reader.read(in);
//上面这部分一样,
//获取配置文件中的相关信息
Element sexElt = (Element)doc.selectObject("/employees/employee/sex");
Element ageElt = (Element)doc.selectObject("/employees/employee/age");
System.out.println(sexElt.getStringValue());
System.out.println(ageElt.getStringValue());
} catch (DocumentException e) {
e.printStackTrace();
}
}</span>
客户端调用
<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void main(String[] args) {
DOM4JReadXML dom4j = new DOM4JReadXML();
//使用输入流得到要读取的xml文件
//读取classpath下的TestXMLFile.xml文件
//ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法,
//使用相对于当前项目的classpath的相对路径来查找资源。
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("TestXMLFile.xml");
dom4j.ReadXml(in);
//使用File查找xml文件
File file = new File("e:/TestXMLFile.xml");
dom4j.parserXml(file);
}</span>
使用InputStream输入流查找xml文件,可以查找到classpath下的xml文件,使用相对路径;使用File查找xml文件,可以使用绝对路径,也可以使用相对路径(File file = new File("src/TestXMLFile.xml"),就是在classpath下查找xml文件)。在代码中,我们最好不要使用绝对路径。
其他读写xml文件方法参考:http://blog.csdn.net/sdsky1987/article/details/7286306。