XML 文档结构
XML树结构
结点
文档结点
元素结点
属性结点
文本结点
DOM
什么是DOM
DOM:Document Object Model:文档对象模型,把文档中的成员描述成一个个对象.
使用Java代码操作XML 或者 js代码操作HTML
DOM解析特点
- 在加载的时候,一次性的把整个XML文档加载进内存,在内存中形成一颗树(Document对象).
- 以后使用代码操作Document,其实操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接关系.
- 由于操作的是内存当中的dom,磁盘中xml当中的内容并没有变,要进行同步,让两边保持一致
查询不需要同步,只有数据变化的时候,才需要同步 - 缺点:若XML文件过大,可能造成内存溢出.
DOM 解析步骤
创建解析器工厂
通过解析器工厂得到解析器
通过解析器得到document对象
获取具体的节点内容
ParseClass.java
package com_xml_01.parse;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParseClass {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
/* *
1.创建解析器工厂
2.通过解析器工厂得到解析器
3.通过解析器得到document对象
4.获取具体的节点内容
* */
//创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // Ctrl+1 快捷键
//2.通过解析器工厂得到解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc = db.parse("src/com_xml_01/parse/student.xml");
//4.获取具体的节点内容
NodeList list = doc.getElementsByTagName("name");
Node name = list.item(0); // 返回的是结点
System.out.println(name.getTextContent());
}
}
自动生成
改一下变量名
自动生成
打印看一下
chrl+1
DOM修改元素内容
- 获取所有指定节点
- 获取要修改的节点
- 修改元素内容
- 从内存写到文档做同步操作
DOM添加元素
- 创建一个节点
- 设置元素内容
- 获取要添加元素的父结点
- 添加结点
- 从内存写到文档做同步操作
DOM删除元素
- 获取一个节点
- 获取该节点的父节点,从父节点当中移除
- 从内存写到文档做同步操作
DOM添加元素属性
- 获取要添加属性的节点
- 把获取的节点强制转换成element
- 设置属性
- 从内存写到文档做同步操作
package com_xml_01.parse;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParseClass {
public static void main(String[] args) throws TransformerFactoryConfigurationError, Exception {
/* *
1.创建解析器工厂
2.通过解析器工厂得到解析器
3.通过解析器得到document对象
4.获取具体的节点内容
* */
//创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // Ctrl+1 快捷键
//2.通过解析器工厂得到解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc = db.parse("src/com_xml_01/parse/student.xml");
//4.获取具体的节点内容
test1(doc);
test2(doc);
test3(doc);
//test4(doc);
test5(doc);
}
// 获取具体的结点内容
static void test1(Document doc) { //4.获取具体的节点内容
NodeList list = doc.getElementsByTagName("name");
Node name = list.item(0); // 返回的是结点
System.out.println(name.getTextContent());
}
// 修改元素内容
static void test2(Document doc) throws TransformerFactoryConfigurationError, Exception {
//1. 获取所有指定节点
//2.获取要修改的节点
//3.修改元素内容
//4.从内存写到文档做同步操作
NodeList agelist = doc.getElementsByTagName("age"); //1. 获取所有指定节点
Node ageNode = agelist.item(1); //2.获取要修改的节点
ageNode.setTextContent("400"); //3.修改元素内容
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml")); //第一个输入的,第二个是输出
}
//添加元素
static void test3(Document doc) throws TransformerFactoryConfigurationError, TransformerException {
//1.创建一个节点
//2.设置元素内容
//3.获取要添加元素的父结点
//4.添加结点
//5.从内存写到文档做同步操作
Element addressEle = doc.createElement("address"); //1.创建一个节点
addressEle.setTextContent("地址"); //2.设置元素内容
Node stuNode = doc.getElementsByTagName("student").item(0); //3.获取要添加元素的父结点
stuNode.appendChild(addressEle); //4.添加结点
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));
}
//删除元素
static void test4(Document doc) throws TransformerFactoryConfigurationError, TransformerException {
//1.获取一个节点
//2.获取该节点的父节点,从父节点当中移除
//3.从内存写到文档做同步操作
Node addressNode = doc.getElementsByTagName("address").item(0); //1.获取一个节点
addressNode.getParentNode().removeChild(addressNode); //2.获取该节点的父节点,从父节点当中移除
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));
}
//添加元素属性
static void test5(Document doc) throws TransformerFactoryConfigurationError, TransformerException {
//1. 获取要添加属性的节点
//2. 把获取的节点强制转换成element
//3. 设置属性
//4. 从内存写到文档做同步操作
Node stu = doc.getElementsByTagName("student").item(1); //1. 获取要添加属性的节点
Element ele = (Element)stu;
ele.setAttribute("ID", "00001");
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/com_xml_01/parse/student.xml"));
}
}
dom4j 解析
Sax解析
逐行读取,基于事件驱动
优点:不占内存,速度快
缺点:只能读取,不能回写
DOM4J介绍
- DOM4J是dom4j.org出品的一个开源XML解析包
- dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件
- 越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
安装与配置
1.在工程文件夹下新建文件夹 lib
2.将第三方包放到lib
问价夹下
3.build-path
4.成功
不用第三方包时,彻底删除
在工程文件夹上右键
DOM4J 获取标签内容
package com_xml_01.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
public static void main(String[] args) throws Exception {
//获取所有标签的内容
/* *
1. 创建SAXReader
2. 获取根元素
3. 获取根元素下的所有元素
4. 遍历每一个元素
5. 获取指定名称的元素
6. 获取标签当中的文本
*/
SAXReader reader = new SAXReader(); //1. 创建SAXReader
Document doc = reader.read("src/com_xml_01/dom4j/student.xml");
Element rootElement = doc.getRootElement(); //获取根元素
List<Element> stuList = rootElement.elements("student"); //根据名称获取根元素下的所有子标签
for (Element stuEle : stuList) { //遍历每一个元素
//法一:
//Element nameEle = stuEle.element("name"); //获取指定名称的元素
//System.out.println(nameEle.getText()); //获取标签当中的文本
//法二:
String name = stuEle.elementText("name");
String age = stuEle.elementText("age");
String sex = stuEle.elementText("sex");
String num = stuEle.attributeValue("number"); //获取属性值
System.out.println(name);
System.out.println(age);
System.out.println(sex);
System.out.println(num);
System.out.println("-------");
}
}
}
DOM4J 添加元素
- 创建SAXReader
- 获取根元素
- 给元素添加属性,并返回添加的元素
package com_xml_01.dom4j;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jTest {
public static void main(String[] args) throws Exception {
//获取所有标签的内容
/* *
1. 创建SAXReader
2. 获取根元素
3. 获取根元素下的所有元素
4. 遍历每一个元素
5. 获取指定名称的元素
6. 获取标签当中的文本
*/
SAXReader reader = new SAXReader(); //1. 创建SAXReader
Document doc = reader.read("src/com_xml_01/dom4j/student.xml");
test1(doc);
test2(doc);
}
static void test1(Document doc) {
Element rootElement = doc.getRootElement(); //获取根元素
List<Element> stuList = rootElement.elements("student"); //根据名称获取根元素下的所有子标签
for (Element stuEle : stuList) { //遍历每一个元素
//法一:
//Element nameEle = stuEle.element("name"); //获取指定名称的元素
//System.out.println(nameEle.getText()); //获取标签当中的文本
//法二:
String name = stuEle.elementText("name");
String age = stuEle.elementText("age");
String sex = stuEle.elementText("sex");
String num = stuEle.attributeValue("number"); //获取属性值
System.out.println(name);
System.out.println(age);
System.out.println(sex);
System.out.println(num);
System.out.println("-------");
}
}
static void test2(Document doc) throws IOException {
//1.创建SAXReader
//2. 获取根元素
//3.给元素添加属性,并返回添加的元素
Element rootElement = doc.getRootElement(); //获取根元素
Element stuEle = rootElement.addElement("student").addAttribute("number", "a003");
stuEle.addElement("name").setText("王五");
stuEle.addElement("age").setText("1000");
stuEle.addElement("sex").setText("男");
//写入 文本直接追加
//Writer wr = new OutputStreamWriter(new FileOutputStream("src/com_xml_01/dom4j/student.xml"),"UTF-8");
//doc.write(wr);
//wr.close();
// Pretty print the document to System.out 美化写入
OutputFormat format = OutputFormat.createPrettyPrint();
Writer wr = new OutputStreamWriter(new FileOutputStream("src/com_xml_01/dom4j/student.xml"),"UTF-8");
XMLWriter writer = new XMLWriter(wr, format);
writer.write( doc );
wr.close();
}
}