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 ...
随机推荐
- 查询数据库对象的DDL信息
表的DDL select dbms_metadata.get_ddl('HBBL','TABLE','AGREEMENT_MIRROR') from dual:
- Spring命名空间引入方法
spring 整合了各种工具,并且spring提供了对各种工具的xml scheme 的配置方式,简化了开发. 但是对于各种工具的xml命名空间的引入,我一直很郁闷,不知道应该怎样引入,今天经过摸索发 ...
- QTP 11 补丁大全
原文: http://relevantcodes.com/qtp-11-0-patches/ Patch Link Details Support for Chrome 19 QTPWEB_00102 ...
- delphi 访问 protected 属性 哈哈
unit Unit39; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...
- 类InetAddress
如果一个类没有构造方法:A:成员全部是静态的(Math,Arrays,Collections)B:单例设计模式(Runtime)C:类中有静态方法返回该类的对象(InetAddress) public ...
- try...catch语句
程序的异常:Throwable 严重问题Error我们不处理,这种问题一般都是很严重的,比如内存溢出 问题Exception 编译期问题不是RuntimeException的异常必须进行处理,如果不处 ...
- Mac016--安装kubernetes(k8s)
一.安装kubernetes(k8s) 参考: http://batizhao.github.io/2018/01/18/Running-Kubernetes-Locally-via-Minikube ...
- Java之九九乘法表
public class MultiplicationTable { public static void main(String[] args) { for(int i=1;i<=9;i++) ...
- [2019杭电多校第七场][hdu6651]Final Exam
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6651 题意:n个科目,总共m分,通过一科需要复习花费科目分数+1分钟,在不知道科目分数的情况下,问最少 ...
- Git同步问题
1. 无法合并不相关历史记录 git pull origin master --allow-unrelated-histories