一、DOM解析特点:
(1)在加载的时候,一次性的把整个XML文档加载进内存,在内存中形成一颗树(Document对象);
(2)使用代码操作Document,其实操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接关系;
(3)由于操作的是内存当中的dom,磁盘中xml当中的内容并没有变,要进行同步,让两边保持一致;
(4)缺点:若XML文件过大,可能造成内存溢出;
二、DOM解析使用的类和接口:
1、DocumentBuilderFactory类:位于java.lang.Object包;
//使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器。
(1)获取实例对象:static DocumentBuilderFactory newInstance() ;
//获取DocumentBuilderFactory工厂;
(2)方法:abstract DocumentBuilder newDocumentBuilder()
//获取DocumentBuilder的实例对象;
2、DocumentBuilder类
方法:Document parse(File f);解析指定XML文件,返回一个 DOM Document 对象。
3、Document接口:
方法:
(1)NodeList getElementsByTagName(String tagname);返回指定标签名的NodeLIst集合;
(2)NodeList getChildNodes();返回所有的子节点集合;
4、NodeList接口:
方法:
(1)int getLength();返回节点个数;
(2)Node item(int index);返回指定索引的Node接口;
5、Node接口:
查询:
(1)String getTextContent();返回节点及后代的文本;
(2)String getNodeName();返回节点名;
(3)String getNodeValue();返回节点值;
(4)short getNodeType();返回节点类型的数值;
(5)NamedNodeMap getAttributes();返回当前元素节点的所有属性节点集合;
修改:
(1)void setTextContent(String textContent);把指定的node对象的值修改为textContent;
6、Element接口:
//Node的父接口;
(1)void setTextContent(String textContent);
//设置新创建的解点内容;
(2)Node appendChild(Node newChild);返回值为添加的节点;
//把新的解点添加到指定节点的末尾;
7、TransformerFactory:位于java.lang.Object包;
//传输器,用于同步XML代码;
(1)获取实例对象:static TransformerFactory newInstance();
(2)方法:abstract Transformer newTransformer();
8、Transformer:
方法:abstract void transform(Source xmlSource, Result outputTarget);
//用流同步本地xml文件;
//参数:1)source传入DOMSource的实例对象;2)传入:StreamResult的实例对象;
三、DOM解析查询元素:
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <number>001</number> <name>论语</name> <author>孔子</author> </book> <book> <number>002</number> <name>西游记</name> <author>吴承恩</author> </book> <book> <number>003</number> <name>时间简史</name> <author>霍金</author> </book> </books>
public class Test {
public static void main(String[] args) throws Exception {
// 1、创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2、通过解析器工厂得到解析器
DocumentBuilder db = dbf.newDocumentBuilder();
// 3、通过解析器得到document对象
Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml");
// 4、根据根节点名称获取节点内容
NodeList nodeList = doc.getElementsByTagName("book");
System.out.println(nodeList.getLength());
// 5、返回节点文本
Node item = nodeList.item(0);
System.out.println(item.getTextContent());
}
}
三、DOM解析修改元素:
public class Test {
public static void main(String[] args) throws Exception {
// 1、创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2、通过解析器工厂得到解析器
DocumentBuilder db = dbf.newDocumentBuilder();
// 3、通过解析器得到document对象
Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml");
// 4、根据根节点名称获取节点内容
NodeList nodelist = doc.getElementsByTagName("name");
Node node = nodelist.item(0);
// 5、修改值
node.setTextContent("修改后的书名");
// 6、创建传输器
Transformer tf = TransformerFactory.newInstance().newTransformer();
// 7、同步本地xml;
tf.transform(new DOMSource(doc), new StreamResult("E:\\JavaProject\\review\\src\\dom\\Book.xml"));
}
}
三、DOM解析添加元素:
public class Test { public static void main(String[] args) throws Exception { // 1、创建解析器工厂 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 2、通过解析器工厂得到解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // 3、通过解析器得到document对象 Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml"); // 4、根据根节点名称获取节点内容 NodeList nodelist = doc.getElementsByTagName("books"); Node node = nodelist.item(0); //5、创建一个节点 Element book = doc.createElement("book"); book.setTextContent("新书"); // 6、新节点插入 node.appendChild(book); // 7、同步本地xml Transformer tf = TransformerFactory.newInstance().newTransformer(); tf.transform(new DOMSource(doc), new StreamResult("E:\\JavaProject\\review\\src\\dom\\Book.xml")); } }
三、DOM解析删除元素:
public class Test { public static void main(String[] args) throws Exception { // 1、创建解析器工厂 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 2、通过解析器工厂得到解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // 3、通过解析器得到document对象 Document doc = db.parse("E:\\JavaProject\\review\\src\\dom\\Book.xml"); // 4、根据根节点名称获取节点内容 NodeList nodelist = doc.getElementsByTagName("book"); Node node = nodelist.item(0); // 5、获得指定node节点的父节点 Node parentNode = node.getParentNode(); // 6、通过父节点删除指定节点 parentNode.removeChild(node); // 7、同步本地xml Transformer tf = TransformerFactory.newInstance().newTransformer(); tf.transform(new DOMSource(doc), new StreamResult("E:\\JavaProject\\review\\src\\dom\\Book.xml")); } }
原文:https://www.cnblogs.com/Tractors/p/11300124.html