package cn.itcast.jaxptest;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class TestJaxp {

public static void main(String[] args) throws Exception {
//selectAll();
//selectSin();
//addSex();
//modifySex();
//delSex();
listElement();
}

//查询所有name元素的值
private static void selectAll() throws ParserConfigurationException, SAXException, IOException {
//查询所有name元素的值
/*
*步骤:
*1、创建解析器工厂
*2、根据解析器工厂创建解析器
*3、解析xml返回document
*/
//创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//解析xml返回的document
Document document=builder.parse("person.xml");
//得到name元素
NodeList list=document.getElementsByTagName("name");
//遍历集合
for(int i=0;i<list.getLength();i++){
Node name1=list.item(i);//得到里面name元素
String name=name1.getTextContent();//得到name元素的值

System.out.println(name);
}
}

//查询xml中第一个name元素的值
public static void selectSin() throws Exception{
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml,返回document
* 4、得到所有name元素
* 5、使用返回集合,里面方法item,下标获取具体的元素
* 6、得到具体的值,使用getTextContent方法
*
*/

//1、创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();

//2、根据解析器工厂创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();

//3、解析xml,返回document
Document document=builder.parse("person.xml");

//4、得到所有name元素
NodeList list=document.getElementsByTagName("name");

//5、使用集合里面的方法item,下标获取元素
Node node=list.item(0);
String name=node.getTextContent();
System.out.println(name);
}

//添加节点,在第一个p1下面添加一个sex女
public static void addSex() throws Exception{
/*
*1、创建解析器工厂
*2、创建解析器
*3、解析xml,返回document
*4、得到第一个p1
* -得到所有p1,使用item方法下标得到
*5、创建sex标签createElement
*6、创建文本createTextNode
*7、把文本添加到sex下面appendChild
*8、把sex添加到第一个p1下面
*9、回写xml,让写入文件生效
* --创建TransformerFactory对象:
* --创建Transformer对象
* --transform.
*
*
*/
//1、创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//2、创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//3、解析xml,返回document
Document document=builder.parse("person.xml");
//4、得到第一个p1
Node p1=document.getElementsByTagName("p1").item(0);
//5、创建sex标签createElement
Element sex1=document.createElement("sex");
//6、创建文本createTextNode
Text text1=document.createTextNode("nv");
//7、把文本添加到sex下面appendChild
sex1.appendChild(text1);
//8、把sex1添加到p1下面
p1.appendChild(sex1);
//9、回写
TransformerFactory factory=TransformerFactory.newInstance();
Transformer transformer=factory.newTransformer();
//transformer.transform(new DOMSource(document) , new StreamResult("person.xml"));
//操作文件需要用流,
transformer.transform(new DOMSource(document) , new StreamResult("person.xml"));

}

//使用jaxp修改节点
//修改第一个<sex>nan</sex>
public static void modifySex() throws Exception{
//1、创建解析器工厂
//2、创建解析器
//3、解析xml,得到document
//4、得到sex item方法
//5、修改sex里面的值setTextContent方法
//6、回写xml

//创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//2、创建解析器
DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
//3、解析xml,得到document
Document document=documentBuilder.parse("person.xml");
//4、得到sex节点
Node sex1=document.getElementsByTagName("sex").item(0);
//5、设置sex的值
sex1.setTextContent("nan");
//6、回写
TransformerFactory factory=TransformerFactory.newInstance();
Transformer transformer=factory.newTransformer();
//把内存中的东西,写到文件中
transformer.transform(new DOMSource(document), new StreamResult("person.xml"));

}

//使用jaxp删除节点
//删除<sex></sex>

public static void delSex() throws Exception{
/**
* 1、创建解析器工厂
* 2、创建解析器
* 3、解析xml,得到document
* 4、获取sex元素
* 5、获取sex的父节点
* 6、使用父节点删除子节点removeChild
* 7、回写
*/
//1、创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//2、创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//3、解析xml,得到document
Document document=builder.parse("person.xml");
//4、获取sex元素
Node sex=document.getElementsByTagName("sex").item(0);
//5、获取sex父节点
Node parent=sex.getParentNode();
//6、使用父节点删除子节点
parent.removeChild(sex);
//7、回写
TransformerFactory factory=TransformerFactory.newInstance();
Transformer transformer=factory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("person.xml"));

}

//使用jaxp遍历节点
public static void listElement() throws Exception{
/**
* 1、创建解析器工厂
* 2、创建解析器
* 3、解析xml,得到document
*
* 递归方法实现
* 4、得到根节点
* 5、得到根节点子节点
* 6、得到根节点子节点的子节点
*/
//1、创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//2、创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//3、解析xml文件,获得document
Document document= builder.parse("person.xml");
//递归实现得到根节点子节点
listNode(document);

}
//递归遍历,递归就是自己调自己
public static void listNode(Node node){
//判断是元素类型时候才打印
if(node.getNodeType()==Node.ELEMENT_NODE){
//打印元素名字
System.out.println(node.getNodeName());
}
      
}
}

jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)的更多相关文章

  1. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  2. 打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

    第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demo ...

  3. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...

  4. 【转】C#添加修改删除文件文件夹大全

    [转]C#添加修改删除文件文件夹大全 C#添加修改删除文件文件夹大全 StreamWriter sw = File.AppendText(Server.MapPath(".")+& ...

  5. JavaWeb_day03_员工信息添加修改删除

    day03员工的添加,修改,删除 修改功能 思路 : 点击修改员工数据之后,跳转到单行文本,查询要修改的员工id的全部信息,主键id设置为readonly,其余的都可以修改, 修改之后,提交按钮,提交 ...

  6. Web 1三级联动 下拉框 2添加修改删除 弹框

    Web  三级联动 下拉框 using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  7. div节点的操作(添加,删除,替换,克隆)

    <html> <head> <title></title> <style type="text/css"> div{ b ...

  8. Xamarin.Android 入门实例(4)之实现对 SQLLite 进行添加/修改/删除/查询操作

    1.Main.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  9. (一)DOM 常用操作 —— “查找”节点

    在 DOM 树中,如果想要操作一个节点,那么首先要"查找"到这个节点.查找节点的方法由 Document 接口定义,而该接口由 JavaScript 中的 document 对象实 ...

随机推荐

  1. Python 的几个命令行参数

    1) 以 $ python 方式启动 python 解释器,之后 import 一个模块,将生成 .pyc 文件. 2) 以 $ python -O 方式启动 python 解释器,之后 import ...

  2. python3 练习题 day04

    '''1.整理装饰器的形成过程,背诵装饰器的固定格式''''''开放封闭原则:为了保证程序的稳定性,和功能的可开放性,在不修改目标函数源代码和调用方式的情况下,对目标函数增加新功能'''# def w ...

  3. mybatis 中 foreach collection的三种用法(转)

    文章转自 https://blog.csdn.net/qq_24084925/article/details/53790287 oreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集 ...

  4. [TPYBoard - Micropython之会python就能做硬件 1] 运行第一个脚本——点亮LED

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 会python就能做硬件! 一.TPYBoard V102开发板 TPYBoard V102 ...

  5. Git&Github基本操作与分支管理

    Git的原理涉及快照流.链表.指针等,这里不作过多叙述. 1.基本操作 git init 创建一个 Git 仓库 git clone [url] 拷贝一个 Git 仓库到本地 git add [fil ...

  6. Centos7修改系统时区

    timedatectl status Local time: 四 2014-12-25 10:52:10 CST Universal time: 四 2014-12-25 02:52:10 UTC R ...

  7. 2017湘潭大学邀请赛G题(贪心+优先队列)

    参考博客:http://www.cnblogs.com/chendl111/p/6891770.html 题目链接:https://www.icpc.camp/contests/4mYguiUR8k0 ...

  8. OSS网页上传和断点续传(STSToken篇)

    云账号AccessKey拥有所有API访问权限,在客户端不要直接使用,会泄露ak信息,造成安全问题.所以使用STS方式(临时账号权限)给客户端授权. C#版获取STSToken 一.下载阿里SDK(a ...

  9. 使用redis限制ip访问次数

    策略1: 在redis中保存一个count值(int),key为user:$ip,value为该ip访问的次数,第一次设置key的时候,设置expires. count加1之前,判断是否key是否存在 ...

  10. PAT L2-016 愿天下有情人都是失散多年的兄妹

    https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 呵呵.大家都知道五服以内不得通婚,即两个人最 ...