1.DOM4J是什么
是一种XML文档解析规范,底层也需要DOM4J解析器实现与支持
2.DOM4J结构
Node,Document,Element
3.DOM4J获取Document对象
a.先获取SAXReader对象
SAXReader reader = new SAXReader();
b.再来加载XML文档
Document doc = reader.read("src/students.xml");
4.保存Document对象
使用XMLWriter对象的write()方法来完成,以什么形式保存
OutputFormat format = new OutputFormat("\t", true);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter(xmlName), format);
writer.write(doc);
writer.close();
5.练习DOM4J
1.创建DOM4JUtils
public class Dom4jUtils {
public static String PATH = "src/p1.xml";
// 获得解析器
public static Document getDocument(String path) throws DocumentException {
SAXReader sr = new SAXReader();
Document doc = sr.read(path);
return doc;
}
// 回写
public static void xmlwirter(String path, Document doc) throws IOException {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlwirter = new XMLWriter(new FileOutputStream(path),format);
xmlwirter.write(doc);
xmlwirter.close();
}
}
2.Test
package pack;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
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.xml.sax.DocumentHandler;
public class Demo{
public static void main(String[] args) throws Exception {
//selectSin();
// selectAll();
// selectSecond();
// addsex();
// addNodeBefore();、
// modifyNode();
// removeNode();
// gainid();
}
//获取id1的属性值
public static void gainid(){
Document document = Domutils.document(Domutils.PTHA);
Element root = document.getRootElement();
Element p1 = root.element("p1");
String s = p1.attributeValue("id1");
System.out.print(s);
}
//删除节点
public static void removeNode(){
Document document = Domutils.document(Domutils.PTHA);
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element school = p1.element("school");
p1.remove(school);
Domutils.XMLWrite(Domutils.PTHA, document);
}
//修改节点的值
public static void modifyNode(){
Document document = Domutils.document("src/1.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element age = p1.element("age");
age.setText("400");
Domutils.XMLWrite("src/1.xml", document);
}
//在特定的位置插入一个节点
public static void addNodeBefore() throws DocumentException, Exception, FileNotFoundException{
Document document = Domutils.document("src/1.xml");
Element root = document.getRootElement();
List<Element> list = root.elements("p1");
Element shcool = DocumentHelper.createElement("school");
shcool.setText("bvn");
list.add(1,shcool);
//回写
Domutils.XMLWrite("src/1.xml", document);
}
public static void addsex() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/1.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element sex = p1.addElement("sex");
sex.setText("nvn");
//回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlwrite = new XMLWriter(new FileOutputStream("src/1.xml"),format);
xmlwrite.write(document);
xmlwrite.close();
}
public static void selectSecond() throws Exception{
/*
* 1、创建解析器
* 2、得到document
* 3、得到根节点
*
* 4、得到所有的p1
* 5、遍历得到第二个p1
* 6、得到第二个p1下面的name
* 7、得到name的值
* */
SAXReader reafer = new SAXReader();
//得到document
Document document = reafer.read("src/1.xml");
Element root = document.getRootElement();
List<Element> list = root.elements("p1");
Element p1 = list.get(1);
Element name2 = p1.element("name");
String s = name2.getText();
System.out.print(s);
}
//获取得到一个name元素里面的值
public static void selectSin() throws Exception{
// 1.创建解析器;
// 2.得到document
// 3.得到根节点
// 4.得到第一个p1元素
// 5.得到p1下面的name元素
// 6.得到name元素里面的值
// 创建解析器
SAXReader reafer = new SAXReader();
//得到document
Document document = reafer.read("src/1.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element name = p1.element("name");
String text1 = name.getText();
System.out.print(text1);
}
//遍历所有的name值
public static void selectAll() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/1.xml");
Element root = document.getRootElement();
List<Element> list= root.elements("p1");
for(Element element: list){
Element name1 =element.element("name");
String name = name1.getText();
System.out.print(name);
}
}
}
3.Xpath
public class TestDom4jXpath {
@Test
public void fun() throws DocumentException {
// SelectName();
selectAllName();
}
// 使用Xpath获取name元素
public static void SelectName() throws DocumentException {
Document doc = Dom4jUtils.getDocument(Dom4jUtils.PATH);
// 直接使用selectSingleNode方法实现
Node el = doc.selectSingleNode("//p1[@id1='aaaa']/age");
String tx = el.getText();
System.out.println(tx);
}
public static void selectAllName() throws DocumentException{
Document doc = Dom4jUtils.getDocument(Dom4jUtils.PATH);
List<Node> nodes = doc.selectNodes("//age");
for(Node node : nodes ){
String tx = node.getText();
System.out.println(tx);
}
}
}
p1.xml
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1 id1="aaaa">
<age>200</age>
<sex>nan</sex>
<sex>nan</sex>
<sex/>
<school>city</school>
<sex>nv</sex>
<school>nv</school>
<sex>nan</sex>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
1.创建解析器
xml文档在内存中的存放形式为Document
2.读取xml的存放路径
文档的解析
1.获取元素
1.获取document
2.获取根节点getRootElement
3.获取根节点下面的元素Element;
4.获取该元素的属性attributeValue;
制作Dom4jUtils小工具
// selectName();
获取元素的属性:
1.获取根节点
2.获取p1元素
3.试用AttributeValue()获取元素名称
// delSch();
1.获取根节点
2.获取父节点
3.利用父节点的remove删除
// setAge();
1.获取根节点
2.获取父节点
3.获取修改元素
4.修改元素setText;
// addElement();添加元素在末尾
1.
2.
3.DocumentHeader.creatElement()
添加文本
4.获取父节点元素下所有元素
5.使用add(特定位置,创建的元素)
// addP1();在p1末尾添加元素
1.
2.
3.获取父节点
4.addElement()
// selectName2();
1.
2.
3.获取所有P1
4.p1.get(1)
5. p1.get(1) .Element(“name”)
// selectAllName();
1.
2.
3.遍历所有p1
4.获取name元素
5.获取文本