1、关于xml
1.1 xml简介
xml是一种可拓展的标记语言,类似html。是W3C组织发布的,目前遵守的是2000年发布的XML1.0规范。被广泛认为是继Java之后在Internet上最激动人心的新技术。
1.2 xml的优缺点
优点:树状结构简单清晰,无论是人还是计算机都能轻松解析。
缺点:若XML文件过大,可能造成内存溢出。
1.3 xml的用途
传输数据,而非显示数据。
1.4 xml的语法
(1)内容编码和文件本身编码要一致
(2)一个XML文档必须有且仅有一个根标签,不允许标签嵌套
(3)区分大小写
备注:导包记得导org.w3c组织的
2、xml的用法
2.1 DOM:Document Object Model(文档对象模型)
使用面向对象的方式,把xml文件中的结构使用对象来表示。使用Java操作XML类似与使用JavaScript操作HTML。
特点:在加载的时候,一次性把整个XML文档加载进内存,在内存中形成一颗树(Document对象),我们使用代码操作Document,其次操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接关系,除非做同步操作(把内存中的数据更新到XML文件),增删改操作后都需要做同步操作。
2.2 在xml中,一切皆节点(Node)
Document 文档节点(XML文件)
Element 元素节点(使用<>表示标签)
Attr 属性节点(元素上属性名=“属性值”)
Text 文本节点(元素之间的内容)
2.3 操作步骤
(1)必先得知被操作的XML文件路径:
File file = new File("C:/Users/WZX/IdeaProjects/jdbc/src/main/resources/xml/contacts.xml");
(2)创建DocumentBuilderFactory对象(工厂类一般都有一个静态方法用于返回当前工厂类对象)
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(3)根据工厂对象,创建DocumentBulider对象
DocumentBuilder builder = factory.newDocumentBuilder();
(4) 根据Builder对象去解析一个已经存在的xml文件,从而获得Document对象
Document document = builder.parse(file);
2.4 常用方法
(1)Node中的方法
String getTextContext():获取当前元素的文本内容
void setTextContext(String textContext):给当前元素设置新的文本内容
Node appendChild(Node newChild) :给当前元素设置一个子元素
Node removeChild(Node oldChild):删除当前元素中指定的一个子元素
(2)Document中的方法
Element getDocumentElement():获取文档的根元素
Element getElementsByTagName(String tagName):根据元素的名称获取多个元素集合对象,从整个文档中寻找
Element createElement(String tagName):根据元素名称,创建元素对象
(3)Element中的方法
NodeList getElementsByTagName(String tagName):根据元素的名称获取多个元素集合对象,从当前元素的子元素中去寻找
String getAttribute(String name):获取当前元素的指定属性的值
void setAttribute(string name,String value):给当前元素设置指定的属性名称和值
3、xml文件(contacts.xml)
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
<linkman>
<age>20</age>
<name>zavier</name>
<email>31@qq.com</email>
</linkman>
<linkman>
<age>20</age>
<name>china</name>
<email>31@qq.com</email>
</linkman>
</contacts>
4、测试代码
package springboot;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileWriter;
import java.util.List;
public class XMLTests {
/*
获取Document文本对象
*/
// 要操作文本对象,首先就要获取文本对象的路径
File file = new File("C:/Users/WZX/IdeaProjects/jdbc/src/main/resources/xml/contacts.xml");
// 创建DocumentBuilderFactory对象(工厂类一般都有一个静态方法用于返回当前工厂类对象)
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document document;
Element root;
{
try {
// 根据工厂对象,创建DocumentBulider对象
builder = factory.newDocumentBuilder();
// 根据Builder对象去解析一个已经存在的xml文件,从而获得Document对象
document = builder.parse(file);
// 获取XMl文档的根元素
root = document.getDocumentElement();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取第二个联系人的姓名
*
* @throws Exception
*/
@Test
public void testGet() throws Exception {
// 获取根元素中第二个联系人,item表示第几个元素,索引从0开始
Element linkman = (Element) root.getElementsByTagName("linkman").item(1);
// 获取第二个联系人的姓名
Element name = (Element) linkman.getElementsByTagName("name").item(0);
System.out.println(name.getTextContent());
}
/**
* 修改第二个联系人的姓名
*/
@Test
public void testUpdate() throws Exception {
// 获取根元素中第二个联系人
Element element = (Element) root.getElementsByTagName("linkman").item(1);
// 获取第二个联系人的姓名
Element name = (Element) element.getElementsByTagName("name").item(0);
// 修改第二个联系人的姓名
name.setTextContent("china");
System.out.println(name.getTextContent());
// 此时只是内存中修改了,contacts.xml中并没有改变,需要把内存中的数据同步到磁盘中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 源:内存中的Document对象
Source source = new DOMSource(document);
// 目标:磁盘中的XML文件(contacts.xml)
StreamResult result = new StreamResult(file);
transformer.transform(source,result);
}
/**
* 向指定元素中新增子节点
* 新增联系人
*/
@Test
public void testAdd() throws Exception {
//创建元素节点以及子节点
Element linkman = document.createElement("linkman");
Element age = document.createElement("age");
Element name = document.createElement("name");
Element email = document.createElement("email");
// 给linkman设置属性
linkman.setAttribute("id","4");
// 给创建的元素子节点赋值
age.setTextContent("20");
name.setTextContent("呵呵");
email.setTextContent("za@");
// 把子节点加到linkman节点中
linkman.appendChild(name);
linkman.appendChild(age);
linkman.appendChild(email);
// 把linkman节点加到contacts节点中(根元素)
root.appendChild(linkman);
// 同步:把内存中的内容同步到磁盘中
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(file));
}
/**
* 设置/获取元素的属性
*/
@Test
public void testEleAttr() throws Exception {
Element linkman = (Element) root.getElementsByTagName("linkman").item(3);
//设置元素属性
// linkman.setAttribute("id","04");
// 获取元素属性
String id = linkman.getAttribute("id");
System.out.println(id);
// 同步:把内存中的内容同步到磁盘中
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(file));
}
/**
* 删除指定元素节点
*/
@Test
public void testDelete() throws Exception{
Element linkman = (Element) root.getElementsByTagName("linkman").item(2);
// 调用父类中的方法删除改元素
linkman.getParentNode().removeChild(linkman);
// 同步:把内存中的内容同步到磁盘中
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document),new StreamResult(file));
}
/**
* 在内存中创建一个Document对象
*/
@Test
public void testAddDoc() throws Exception{
// 要操作文本对象,首页就要获取文本对象的路径
File newFile = new File("C:/Users/WZX/IdeaProjects/jdbc/src/main/resources/xml/addDocument.xml");
Document doc = null;
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 判断文件是否存在,不存在则创建,存在则解析
if (newFile.exists()){
doc = docBuilder.parse(newFile);
}else {
doc = docBuilder.newDocument();
//创建根元素
Element contacts = doc.createElement("contacts");
// 创建元素节点
Element linkman = doc.createElement("linkman");
Element name = doc.createElement("name");
name.setTextContent("王五");
linkman.appendChild(name);
contacts.appendChild(linkman);
doc.appendChild(contacts);
}
// 同步
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc),new StreamResult(newFile));
}
}