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 实例可用于创建 TransformerTemplates 对象)

  一些方法

    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)的更多相关文章

  1. dom解析器机制 web基本概念 tomcat

    0 作业[cn.itcast.xml.sax.Demo2]   1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...

  2. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  3. 使用Dom解析器,操作XML里面的信息

    import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;impo ...

  4. JAVA与DOM解析器基础 学习笔记

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的 ...

  5. 使用dom解析器对xml文档内容进行增删查改

    直接添代码: XML文档名称(one.xml) <?xml version="1.0" encoding="UTF-8" standalone=" ...

  6. 解析XML文件之使用DOM解析器

    在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...

  7. Java DOM解析器 - 解析XML文档

    使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...

  8. PHP Simple HTML DOM解析器

    一直以来使用php解析html文档树都是一个难题.Simple HTML DOM parser 帮我们很好地解决了使用 php html 解析 问题.可以通过这个php类来解析html文档,对其中的h ...

  9. PHP Simple HTML DOM解析器使用入门

    http://www.cnphp.info/php-simple-html-dom-parser-intro.html 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM ...

  10. PHP HTML DOM 解析器 中文手册

    简单的PHP HTML DOM 解析器 中文手册 | PHP Simple HTML DOM Parser中文手册 目录 快速入门 如何创建HTML DOM 对象? 如何查找HTML元素? 如何访问H ...

随机推荐

  1. easyui表格适应bootstrap

    .panel1 { overflow: hidden; text-align: left; margin:; border:; -moz-border-radius: 0 0 0 0; -webkit ...

  2. WPF 实现多语言支持

    WPF 多语言有各种实现方式.如 https://www.codeproject.com/Articles/35159/WPF-Localization-Using-RESX-Files,后来发现这个 ...

  3. Ubuntu中几个字符小玩意儿

    1.黑客帝国特效: 打开终端,输入 sudo apt install cmatrix 即可.安装完成后,在终端输入 cmatrix 即可出现特效. 2.奔跑的小火车: 终端输入:sudo apt in ...

  4. EF6中一个关于时间类型 datetime2 的坑

    在一个访问下位机的程序中,返回的时间戳有时候因断线产生0001年01月01日的时间,而原先使用拼接SQL进行数据存储的操作时,这个问题是可以跳过的. 这次把拼接SQL的部分重新改为EF进行管理,这个坑 ...

  5. Linux - 创建交换分区 swap

    购买的 1GB 内存的 Linux 小机器,在编译安装 PHP 的时候内存捉急,只好开启 swap 交换分区来增大内存. [root@VM_139_38_centos php-7.2.12]# cat ...

  6. dockerFile 配置puppeteer

    ## install npm && puppeteer## 必要依赖 libXScrnSaver RUN yum -y install libXScrnSaver ## install ...

  7. windows 10上玩耍ubuntu

    win10 已经支持运行子系统ubuntu了. 安装ubuntu 程序和功能>>启用或关闭Windows功能>>勾选"适用于Linux的Windows子系统" ...

  8. 20171110面试笔记 服务器端程序员+C/C++开发

    socket 模型: https://www.cnblogs.com/nsnow/archive/2011/05/03/2036017.html http://blog.csdn.net/normal ...

  9. npm搭建vue全过程

    如何在Window下安装node\cnpm,并安装vue.js,创建项目 参考链接:https://blog.csdn.net/Corey_mengxiaodong/article/details/8 ...

  10. 针对【H-2017年信息基础班(周一班)】某些同学恶意使用lyl洛谷的谴责

    我在此发表针对 2019-04-01 17:38 某些hsy班同学恶意使用lyl账号的强烈谴责,望自重!! 以下为证据: 传送门