dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
下载dom4j解析xml文档所需要的jar包:根据需要下载和合适的dom4j
步骤:
001
Python3网络爬虫开发实战
崔庆才
75.0
添加的节点
002
Linux鸟哥的私房菜
鸟哥
70.0
public static void main(String[] args) {
// 1.获得解析器
SAXReader reader = new SAXReader();
try {
// 2.根据解析器获得document对象
Document document = reader.read(new File("xml/books.xml"));
// 3.获得根元素
Element rootElement = document.getRootElement();
// 4.获得根元素下所有的子元素
List list = rootElement.elements();
// 5.遍历子元素
for (Element element : list) {
// 6.获得元素的属性
String attribute = element.attributeValue("id");
System.out.println(attribute);
// 7.获得子元素下所有的子元素
List elements = element.elements();
// 8.遍历所有子元素下所有的子元素
for (Element element2 : elements) {
System.out.println(element2.getText());
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
@Test
// 添加元素操作
public void Test1() throws DocumentException, IOException {
// 1、获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2、获得根元素
Element rootElement = document.getRootElement();
// 3、获得要插入的位置
Element book = rootElement.element("book");
List list = book.elements();
// 4、创建元素并插入到book中
Element addElement = book.addElement("addNode");
addElement.addText("添加的节点");
// Element address = DocumentHelper.createElement("address");
// address.setText("河南南阳");
// Element addText = address.addText("河南南阳");
// System.out.println(address);
// System.out.println(addText);
// 5、添加元素
// book.add(address);
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 在指定位置添加元素操作
public void Test2() throws DocumentException, IOException {
// 1、获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2、获得根元素
Element rootElement = document.getRootElement();
// 3、获得根下的子元素
Element book = rootElement.element("book");
// 创建元素
Element data = DocumentHelper.createElement("data");
data.setText("2016-12-15");
// 获得book下的所有子元素
List list = book.elements();
list.add(1, data);
// 回写
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 添加属性
public void Test4() throws DocumentException {
// 1、获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2、获得根元素
Element rootElement = document.getRootElement();
// 3、获得根下的子元素
Element book = rootElement.element("book");
// 添加属性language
book.addAttribute("language", "zh");
// 回写
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 添加元素操作
public void Test1() throws DocumentException, IOException {
// 1、获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2、获得根元素
Element rootElement = document.getRootElement();
// 3、获得要插入的位置
Element book = rootElement.element("book");
List list = book.elements();
// 4、创建元素并插入到book中
Element addElement = book.addElement("addNode");
addElement.addText("添加的节点");
// Element address = DocumentHelper.createElement("address");
// address.setText("河南南阳");
// Element addText = address.addText("河南南阳");
// System.out.println(address);
// System.out.println(addText);
// 5、添加元素
// book.add(address);
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 在指定位置添加元素操作
public void Test2() throws DocumentException, IOException {
// 1、获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2、获得根元素
Element rootElement = document.getRootElement();
// 3、获得根下的子元素
Element book = rootElement.element("book");
// 创建元素
Element data = DocumentHelper.createElement("data");
data.setText("2016-12-15");
// 获得book下的所有子元素
List list = book.elements();
list.add(1, data);
// 回写操作
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 添加属性
public void Test4() throws DocumentException {
// 1、获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2、获得根元素
Element rootElement = document.getRootElement();
// 3、获得根下的子元素
Element book = rootElement.element("book");
// 添加属性language
book.addAttribute("language", "zh");
// 回写
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 修改元素操作
public void Test6() throws DocumentException {
// 1.获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2.获得xml文件的根元素
Element rootElement = document.getRootElement();
// 3.获得book元素下的子元素data元素
Element book = rootElement.element("book").element("data");
book.setText("1997-12-15");
// 4.进行回写操作
saxReaderUtil.backWrite(document, "xml/books.xml");
}
@Test
// 修改元素属性
public void Test7() throws DocumentException {
// 1.获得document对象
Document document = saxReaderUtil.getDocument("xml/books.xml");
// 2.获得xml文件的根元素
Element rootElement = document.getRootElement();
// 3.获得book元素
Element book = rootElement.element("book");
// 4.设置修改属性值
book.addAttribute("language", "en");
// book.setAttributeValue("language", "en");//过时的代替的方式是addAttribute
// 5.进行回写操作
saxReaderUtil.backWrite(document, "xml/books.xml");
}
进行回写的原因:对books.xml文件的增删改操作只是在内存中,我们需要将内存中已经增删改之后的结果重新刷到books.xml文件中
官方的得到Document对象:
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
//url为xml文件的路径
Document document = reader.read(url);
return document;
}
官方的将文档写入文件
//通过该方法可以快速简便地将Document(或任何Node)写入a 。 Writerwrite()
FileWriter out = new FileWriter("foo.xml");
document.write(out);
out.close();
根据文档自己编写的:
//saxReaderUtil类
public class saxReaderUtil {
public static Document getDocument(String uri) throws DocumentException {
// 获得解析器工厂
SAXReader reader = new SAXReader();
// 根据解析器工厂获得document
Document document = reader.read(new File(uri));
// 返回document对象
return document;
}
// 回写操作
public static void backWrite(Document document, String uri) {
try {
// 方法creatCompactFormat()是不可以格式化文件
// OutputFormat of = OutputFormat.createCompactFormat();
// 方法creatPrettyPrint是可以格式文件的
// OutputFormat of = OutputFormat.createPrettyPrint();
// XMLWriter writer = new XMLWriter(new OutputStreamWriter(new
// FileOutputStream("xml/books.xml"),"utf-8"),of);
// writer.write(document);
// writer.close();
// 问题:乱码
// 原因:使用FileWriter默认的编码是GBK,而books.xml的编码格式是utf-8
// 解决乱码的方案使用OutputStreamWriter
// 解决乱码的方案二:
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(uri), format);
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}