4. jaxp----dom解析器(DocumentBuilderFactory、DocumentBuilder)
1.DocumentBuilderFactory--解析器工厂(抽象类 javax.xml.parsers.DocumentBuilderFactory)
newInstance() 获取 DocumentBuilderFactory 的新实例。
newDocumentBuilder() 使用当前配置的参数创建一个新的 DocumentBuilder 实例。
2.DocumentBuilder--解析器(抽象类 javax.xml.parsers.DocumentBuilder)
parse(String uri)
将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。(url是相对路径---项目)
- Document (接口,父接口Node org.w3c.dom.Document)
- Node (接口 org.w3c.dom.Node )
3.Document(接口,父接口Node org.w3c.dom.Document)
getElementsByTagName(String tagname)
返回文档中所有指定的标签名节点(NodeList)
getElementById(String elementId)
返回具有带给定值的 ID 属性的 Element。
createElement(String tagName)
创建指定的节点(标签)。
createTextNode(String data)
创建给定指定字符串的 Text 节点。
4.NodeList(接口)
jdk文档介绍:NodeList 接口提供对节点的有序集合的抽象,没有定义或约束如何实现此集合。DOM 中的 NodeList 对象是活动的
getLength() 列表中的节点数。
item(int index) 返回集合中的第 index 个项(Node类型)。
5.Node(接口 org.w3c.dom.Node )常用方法
- 获取
getFirstChild() 此节点的第一个子节点。
getLastChild() 此节点的最后一个节点。
getParentNode() 此节点的父节点。
getChildNodes() 包含此节点的所有子节点的 NodeList。
getNextSibling() 直接在此节点之后的节点。
getNodeValue() 此节点的值,取决于其类型;
getPreviousSibling() 直接在此节点之前的节点。
getTextContent() 此属性返回此节点及其后代的文本内容。
- 添加
appendChild(Node newChild) 将节点 newChild 添加到此节点的子节点列表的末尾。
insertBefore(Node newChild, Node refChild) 在现有子节点 refChild 之前插入节点 newChild。
- 删除
removeChild(Node oldChild) 从子节点列表中移除 oldChild 所指示的子节点,并将其返回。
- 修改
replaceChild(Node newChild, Node oldChild) 将子节点列表中的子节点 oldChild 替换为 newChild,并返回 oldChild 节点。
setNodeValue(String nodeValue) 此节点的值,取决于其类型;
setTextContent(String textContent) 此属性返回此节点及其后代的文本内容。
- 判断
isEqualNode(Node arg) 测试两个节点是否相等
xml文件
<?xml version="1.0" encoding="uft-8"?>
<!DOCTYPE persion SYSTEM "NewFile1.dtd">
<persion ID="persion">
<name ID="name1">张三</name>
<name ID="name2">zhangsan</name>
<age ID="age">18</age>
<sex ID="sex">男</sex>
</persion>
java代码(根据标签名,查询标签里面的文本)
public class Demo1 {
public static void main(String[] args) throws Exception {
//查询标签名为name中的文本
selText("name");
} //查询
public static void selText(String strname) throws ParserConfigurationException, SAXException, IOException {
//实例化解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//根据解析器工厂实例化解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//获取xml的全部节点(根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象)
Document document = builder.parse("src/NewFile1.xml");
//根据标签名获取
NodeList list = document.getElementsByTagName(strname);
for(int i = 0 ; i<list.getLength() ; i++) {
//获取每一个name节点
Node name = list.item(i);
//获取每个name节点里面的文本
String nametext = name.getTextContent();
//输出文本
System.out.println(nametext);
}
}
}
结果

在我们使用增删改的时候,我们改动的都是内存中的数据节点,想要改动硬盘上面的数据节点,我们需要更新xml文本,下面是更新文本的一些类和方法
注意:我们的格式要是utf-8,不然我们更新后中文会出现乱码的哦!(gbk和utf-16不能写)
TransformerFactory(抽象类 javax.xml.transform ,TransformerFactory 实例可用于创建 Transformer 和 Templates 对象)
一些方法
newInstance() 创建TransformerFactory实例
newTransformer() 创建Transformer实例
Transformer(抽象类,此抽象类的实例能够将源树转换为结果树。javax.xml.transform)
transform(Source xmlSource, Result outputTarget) 将 XML Source 转换为 Result。
例如:transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
- Source 接口 实现类之一 DOMSource
- Result 接口 实现类之一 StreamResult
添加节点(标签):在最后一个name标签里面添加新标签
代码如下:
public class Demo2 {
public static void main(String[] args) throws Exception {
//实例化解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//实例化解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//获取整个文档的节点对象
Document document = builder.parse("src/NewFile1.xml");
//创建一个标签
Element newelement = document.createElement("newelement");
//创建文本
Text text = document.createTextNode("新添加的标签");
//把文本添加到新创建的标签里面
newelement.appendChild(text);
//获取所有的name标签
NodeList list = document.getElementsByTagName("name");
//获取最后一个name标签
Node node = list.item(list.getLength()-1);
//在最后一个name标签里面添加一个子标签(newelement)
node.appendChild(newelement);
//因为我们处理的都是内存中的数据,不会影响到硬盘上面的数据,所以我们要把我们处理后的数据重新存储到硬盘上。
//更新xml文件(增删改都需要更新xml文件)
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
}
}
xml更新后(我们可以发现添加成功了,但是格式看着很不爽)
<?xml version="1.0" encoding="utf-8" standalone="no"?><persion ID="persion">
<name ID="name1">张三</name>
<name ID="name2">zhangsan<newelement>新添加的标签</newelement></name>
<age ID="age">18</age>
<sex ID="sex">男</sex>
</persion>
删除节点:删除上面添加的标签(下面这个方法只能删除一个目标文件)
public class Demo3 {
public static void main(String[] args) throws Exception {
//实例化解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//实例化解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//获取xml文档(根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象)
Document document = builder.parse("src/NewFile1.xml");
//获取全部的目标节点对象(标签)
NodeList list = document.getElementsByTagName("newelement");
//获取NodeList集合中的一个目标节点
Node node = list.item(0);
//获取目标节点的父节点
Node faterNode = node.getParentNode();
//根据父节点删除父节点中的子节点(目标节点),如果要一次删除多个,那么需要使用循环
faterNode.removeChild(node);
//更新xml文档
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
}
}
<?xml version="1.0" encoding="utf-8" standalone="no"?><persion ID="persion">
<name ID="name1">张三</name>
<name ID="name2">zhangsan</name>
<age ID="age">18</age>
<sex ID="sex">男</sex>
</persion>
修改:把标签名为sex的里面的文本修改
public class Demo4 {
public static void main(String[] args) throws Exception {
//实例化解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//实例化解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//获取整个文档的节点对象
Document document = builder.parse("src/NewFile1.xml");
//获取要修改的全部节点(NodeList集合)
NodeList list = document.getElementsByTagName("sex");
//获取目标节点的父节点
//循环NodeList集合,修改指定的全部目标节点(标签)中的文本
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
node.setTextContent("女");
}
//更新xml文档
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
}
}
<?xml version="1.0" encoding="utf-8" standalone="no"?><persion ID="persion">
<name ID="name1">张三</name>
<name ID="name2">zhangsan</name>
<age ID="age">18</age>
<sex ID="sex">女</sex>
</persion>
4. jaxp----dom解析器(DocumentBuilderFactory、DocumentBuilder)的更多相关文章
- dom解析器机制 web基本概念 tomcat
0 作业[cn.itcast.xml.sax.Demo2] 1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- 使用Dom解析器,操作XML里面的信息
import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;impo ...
- JAVA与DOM解析器基础 学习笔记
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的 ...
- 使用dom解析器对xml文档内容进行增删查改
直接添代码: XML文档名称(one.xml) <?xml version="1.0" encoding="UTF-8" standalone=" ...
- 解析XML文件之使用DOM解析器
在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...
- Java DOM解析器 - 解析XML文档
使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...
- PHP Simple HTML DOM解析器
一直以来使用php解析html文档树都是一个难题.Simple HTML DOM parser 帮我们很好地解决了使用 php html 解析 问题.可以通过这个php类来解析html文档,对其中的h ...
- PHP Simple HTML DOM解析器使用入门
http://www.cnphp.info/php-simple-html-dom-parser-intro.html 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM ...
- PHP HTML DOM 解析器 中文手册
简单的PHP HTML DOM 解析器 中文手册 | PHP Simple HTML DOM Parser中文手册 目录 快速入门 如何创建HTML DOM 对象? 如何查找HTML元素? 如何访问H ...
随机推荐
- Hyperledger交易流程
Hyperledger Fabric Network中的角色 在Hyperledger中,由三种类型的角色: Client:应用客户端,用于将终端用户的交易请求发送到区块链网络: Peers:负责维护 ...
- centos 6.9 mysql 安装配置
1.全新系统,安装mysql yum -y install mysql mysql-server mysql-devel 2.启动mysql service mysqld start 3.修改密码 登 ...
- C++编译-链接错误集合
1,无法解析的外部符号,链接错误,原因:没找到某个符号(变量或函数)的定义体,一般是对应函数没实现,或第三方库没有添加到工程设置中 2,重复链接链接错误,一个定义体(实现体)被多个CPPP文件包含,导 ...
- 【C++】fill函数,fill与memset函数的区别
转载自:https://blog.csdn.net/liuchuo/article/details/52296646 memset函数 按照字节填充某字符在头文件<cstring>里面fi ...
- Python selenium 三种等待方式详解(必会)
很多人在群里问,这个下拉框定位不到.那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待.殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么 ...
- 如何吸引用户打开自己发送的EDM邮件
一般来说,邮件发送到用户的收件箱,但用户不一定会阅读.因为每个用户收到的邮件都很多.那么,究竟应该如何吸引读者打开自己的EDM邮件呢? 只有当用户认识并信任发件人的时候,此时邮件的打开率是最高的,可以 ...
- 解决ubuntu18.04使用vi编辑器方向键错乱
1.编辑 vimrc.tiny 文件 vi /etc/vim/vimrc.tiny 2.修改下述内容 修改 set compatible 为 set nocompatible 添加 set backs ...
- mongodb 语法小结
数据库 一个mongodb中可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实例可以容纳多个独立的数据库,每一个都有 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_03 过滤器_1_FileFilter过滤器的原理和使用
FileFilter 需要先定义接口的实现类.并重写过滤的方法 使用 并没有起作用 过滤器的原理 缺少了a.java和b.java 如果是文件夹,就返回true,那么就会返回到Files[]数组中.然 ...
- Java 基础-类与面向对象
类 Object 类(java.lang.Object)是所有 Java 类的直接或间接父类. 成员方法及变长参数 方法定义: [public | protected | private] [stat ...