昨天,我做了关于xml的一些简单操作和对dtd约束的简单了解,但是,发现使用jaxp的效果不佳,代码冗余,所以今天学习了一个新的技术去对xml进行更加简便的操作,那就是使用dom4j工具。
从学习xml的方面中:我们知道
关于xml的解析方法:
1)DOM解析:
jaxp jdom dom4j
特点:
一次性把整个文档存在内存里面,要解析需要把整个加载构建成一个DOM树
,通过操作DOM树来操作xml,占用的内存大
2)SAX解析:
特点:
不需要把整个文档存进内存,需要解析的时候而是读取一点,解析一点,占用的内存小
关于DOM4j的解析方法
1)首先需要的步骤一:加载dom4j.jar的jar包
2)然后需要加载xml文件:
SAXReader sr = new SAXReader();
Document doc = sr.read(xml的文件路径);
3)读取标签,通过doc
getRootElement() 根标签
element("name") 获取指定名称的第一个子标签
elements("name") 获取指定名称的所有子标签,返回List集合
elements() 获取所有子标签,返回List集合
elementIterator() 获取所有子标签,返回迭代器
4)读取属性,可以通过doc,也可以通过doc得到的子标签
atttribute("name") 获取指定名称的属性对象
Attribute.getName() /getValue() 获取属性名称和属性值
attributes(): 获取所有属性,返回LIst
attributeIterator() 获取所有属性,返回迭代器
attributeValue("name") 获取指定名称的属性值
5)读取文本的值,可以通过doc,也可以通过doc得到的子标签
getText() 获取当前标签的文本内容
elementText("name") 获取指定名称的子标签文本内容(只能获取第一个)
6)通过dom4j修改文本,需要在内存的读取的同时,还需要把修改的结果保存在硬盘上,
//读取xml文件
SAXReader sr = new SAXReader();
Document doc = sr.read(xml的文件路径);
//写出xml文件
XMLWriter writer = new XMLWriter(
new FileOutputStream(写出的xml文件路径),
//OutputFormat.createCompactFormat() :此默认值,输出的格式是紧凑的
| OutputFormat.createPrettyPrint() :输出的格式是漂亮的
);
writer.write(doc);
writer.close();
增加:
标签: addElement("name")
属性: addAttribute("name","value");
修改:
属性值: addAttribute("name","vaue") / Attribute.setValue("value")
文本: setText("value")
删除:
标签: detach() / getParent().remove(xxx);
属性: detach() / getParent().remove(xxx);
下面是关于dom4j的一些基础的联系:
一、首先是需要操作的xml文件
<?xml version="1.0" encoding="GBK"?>
<exam>
<student idcard="111" examid="222">
<name>张三</name>
<location>沈阳</location>
<grade>89</grade>
</student>
<student idcard="333" examid="444">
<name>李四</name>
<location>大连</location>
<grade>97</grade>
</student>
</exam>
二、创建一个类并导入dom4j的包
package xml.example.reader;
import java.io.FileOutputStream;
import java.io.IOException;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class demo2_writer {
//1.添加属性、标签
@Test
public void test01() throws Exception{
Document doc = read();
Element root = doc.getRootElement();
Element addElement1 = root.addElement("employer");
//已过时 addElement1.setAttributeValue("id", "04");
addElement1.addAttribute("id", "04");
addElement1.addElement("id").addText("4");
addElement1.addElement("name").addAttribute("name", "zl").addText("赵六");
addElement1.addElement("age").addText("15");
addElement1.addElement("departement").addText("服务部");
addElement1.addElement("money").addText("9k");
write(doc);
}
@Test
public void test02() throws Exception{
//修改属性和文本
Document doc = read();
Element root = doc.getRootElement();
//方式一、直接从标签中得到元素的属性然后在覆盖它
// Element element = (Element) root.elements().get(1);
// element.addAttribute("id", "04");
//方式二、从元素中得到了属性之后,再重新设值
/*Element element = (Element) root.elements().get(1);
Attribute attribute = element.attribute("id");
attribute.setValue("05");
*/
//修改文本
Element element = (Element) root.elements().get(1);
element.element("name").addAttribute("name", "zl").setText("赵六");
write(doc);
}
@Test
public void test03() throws Exception{
//删除标签或者属性
Document doc = read();
Element root = doc.getRootElement();
//方式一:从标签中得到属性之后,直接detach删除
Element element = (Element) root.elements().get(2);
element.detach();
//方式二:得到标签之后再从标签得到他的父标签,再删除
// Element element = (Element) root.elements().get(2);
// element.getParent().remove(element);
write(doc);
}
//读取xml文件
public Document read() throws Exception{
SAXReader sr = new SAXReader();
Document doc = sr.read("src/example02.xml");
return doc;
}
//修改到xml文件中
public void write(Document doc) throws Exception{
XMLWriter writer = new XMLWriter(
new FileOutputStream("src/example02.xml")
//,OutputFormat.createCompactFormat()
);
writer.write(doc);
writer.close();
}
}
通过今天的学习,基本了解了dom4j的工作原理与基本操作,明天将学习有关SAX解析和XPath的基本操作,因为如果使用dom4j的操作,当xml的量比较多的话,使用dom4j就比较麻烦了,这个时候就需要XPath了