<?xml version="1.0" encoding="GB2312" ?>
<PhoneInfo>
<Brand name="华为">
<Type name="P9"/>
</Brand>
<Brand name="苹果">
<Type name="iphone5"/>
<Type name="iphone6"/>
</Brand>
</PhoneInfo>

0、整体代码

package test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class XmlTest { Document doc = null;// 创建一个Document对象 public static void main(String[] args) {
XmlTest xml = new XmlTest();
xml.getDocument();
xml.creatNode();
xml.changeType();
xml.showInfo();
xml.deleteNode("SAMSUNG");
xml.showInfo();
xml.saveXml("D:/xml.xml"); } /**
* 获得DOM树
*
*/
public void getDocument() {
// 1、得到DOM工厂解析器工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try {
// 2、从DOM工厂中获得Dom解析器
DocumentBuilder db = factory.newDocumentBuilder();
// 3、解析XML文件获得Document对象,即DOM树
doc = db.parse("收藏信息.xml");
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 显示xml文档信息 !
*/
public void showInfo() {
// 获取DOM树Brand节点
NodeList BrandName = doc.getElementsByTagName("Brand");
for (int i = 0; i < BrandName.getLength(); i++) {
// 获取第i个Brand元素的信息(返回i元素)
Node brand = BrandName.item(i);
// Element是Node的子类,用Element的getAttribute("属性名")获得元素属性
Element element = (Element) brand;
// 获取第i个Brand元素的name属性
String brandAttribute = element.getAttribute("name");
// 获得所有的子节点
NodeList types = element.getChildNodes();
for (int j = 0; j < types.getLength(); j++) {
Node type = types.item(j);
// 判断是否是元素节点(使用getChildNodes()就要判断)
if (type.getNodeType() == Node.ELEMENT_NODE) {
Element typeEle = (Element) type;
String typeAttribute = typeEle.getAttribute("name");
System.out.println("手机:" + brandAttribute + typeAttribute);
}
} }
} /**
* 新增节点
*
*/
public void creatNode() {
// 创建三星节点
Element brandEle = doc.createElement("Brand");
brandEle.setAttribute("name", "三星");
// 创建型号Note7节点
Element type = doc.createElement("Type");
type.setAttribute("name", "Note7");
// 把note7元素挂到三星元素上
brandEle.appendChild(type);
// 找到PhoneInfo节点
NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo");
for (int i = 0; i < PhoneInfosNode.getLength(); i++) {
Node PhoneInfos = PhoneInfosNode.item(i);
if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) {
// 把三星节点挂到PhoneInfo上
PhoneInfos.appendChild(brandEle);
} } }
/**
* 保存xml文档
*
* @param path 保存的路径
*/
public void saveXml(String path) {
// 1、创建转换工厂
TransformerFactory factory = TransformerFactory.newInstance(); try {
// 2、从工厂中获得转换器
Transformer Transformer = factory.newTransformer();
// 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置
// 输出文件编码格式设置
Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
// 需要DOM转换的源文件
DOMSource xmlSource = new DOMSource(doc);
// 指定目标路径
StreamResult outputTarget = new StreamResult(new FileOutputStream(
path));
// 使用transform()进行保存xml文件
Transformer.transform(xmlSource, outputTarget); } catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
/**
* 更改Brand属性
*
*/
public void changeType(){
//获得节点信息
NodeList brandElements = doc.getElementsByTagName("Brand");
//遍历节点
for (int i = 0; i < brandElements.getLength(); i++) {
Node brands = brandElements.item(i);
Element brand=(Element) brands; String brandAtt = brand.getAttribute("name");
//判断节点属性值
if(brandAtt.equals("三星")){
brand.setAttribute("name", "SAMSUNG");
}
}
}
/**
* 删除指定节点
* @param name 删除的Brand属性名
*/
public void deleteNode(String name){
NodeList brandsEle = doc.getElementsByTagName("Brand");
for (int i = 0; i < brandsEle.getLength(); i++) {
Element brand = (Element) brandsEle.item(i);
String brandAttribute = brand.getAttribute("name");
if(brandAttribute.equals(name)){
doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand);
} }
}
}

1、通过DocumentBuilderFactory 获得解析工厂,在工厂中获得解析器实例,通过解析器获得DOM树。

    /**
* 获得DOM树
*
*/
public void getDocument() {
// 1、得到DOM工厂解析器工厂实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try {
// 2、从DOM工厂中获得Dom解析器
DocumentBuilder db = factory.newDocumentBuilder();
// 3、解析XML文件获得Document对象,即DOM树
doc = db.parse("收藏信息.xml");
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

2、保存xml文件

/**
* 保存xml文档
*
* @param path 保存的路径
*/
public void saveXml(String path) {
// 1、创建转换工厂
TransformerFactory factory = TransformerFactory.newInstance(); try {
// 2、从工厂中获得转换器
Transformer Transformer = factory.newTransformer();
// 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置
// 输出文件编码格式设置
Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
// 需要DOM转换的源文件
DOMSource xmlSource = new DOMSource(doc);
// 指定目标路径
StreamResult outputTarget = new StreamResult(new FileOutputStream(
path));
// 使用transform()进行保存xml文件
Transformer.transform(xmlSource, outputTarget); } catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

3、xml文件显示到控制台

/**
* 显示xml文档信息 !
*/
public void showInfo() {
// 获取DOM树Brand节点
NodeList BrandName = doc.getElementsByTagName("Brand");
for (int i = 0; i < BrandName.getLength(); i++) {
// 获取第i个Brand元素的信息(返回i元素)
Node brand = BrandName.item(i);
// Element是Node的子类,用Element的getAttribute("属性名")获得元素属性
Element element = (Element) brand;
// 获取第i个Brand元素的name属性
String brandAttribute = element.getAttribute("name");
// 获得所有的子节点
NodeList types = element.getChildNodes();
for (int j = 0; j < types.getLength(); j++) {
Node type = types.item(j);
// 判断是否是元素节点(使用getChildNodes()就要判断)
if (type.getNodeType() == Node.ELEMENT_NODE) {
Element typeEle = (Element) type;
String typeAttribute = typeEle.getAttribute("name");
System.out.println("手机:" + brandAttribute + typeAttribute);
}
} }
}

4、添加节点Brand:三星,Type:note7

/**
* 新增节点
*
*/
public void creatNode() {
// 创建三星节点
Element brandEle = doc.createElement("Brand");
brandEle.setAttribute("name", "三星");
// 创建型号Note7节点
Element type = doc.createElement("Type");
type.setAttribute("name", "Note7");
// 把note7元素挂到三星元素上
brandEle.appendChild(type);
// 找到PhoneInfo节点
NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo");
for (int i = 0; i < PhoneInfosNode.getLength(); i++) {
Node PhoneInfos = PhoneInfosNode.item(i);
if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) {
// 把三星节点挂到PhoneInfo上
PhoneInfos.appendChild(brandEle);
} } }

5、修改节点属性,修改"三星"为"SAMSUNG"

/**
* 更改Brand属性
*
*/
public void changeType(){
//获得节点信息
NodeList brandElements = doc.getElementsByTagName("Brand");
//遍历节点
for (int i = 0; i < brandElements.getLength(); i++) {
Node brands = brandElements.item(i);
Element brand=(Element) brands; String brandAtt = brand.getAttribute("name");
//判断节点属性值
if(brandAtt.equals("三星")){
brand.setAttribute("name", "SAMSUNG");
}
}
}

6、删除SAMSUNG节点

/**
* 删除指定节点
* @param name 删除的Brand属性名
*/
public void deleteNode(String name){
NodeList brandsEle = doc.getElementsByTagName("Brand");
for (int i = 0; i < brandsEle.getLength(); i++) {
Element brand = (Element) brandsEle.item(i);
String brandAttribute = brand.getAttribute("name");
if(brandAttribute.equals(name)){
doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand);
} }
}

7、主方法

public static void main(String[] args) {
XmlTest xml = new XmlTest();
xml.getDocument();
xml.creatNode();
xml.changeType();
xml.showInfo();
xml.deleteNode("SAMSUNG");
xml.showInfo();
xml.saveXml("D:/xml.xml"); }

使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点的更多相关文章

  1. html文件在head标签中引入js地址和直接写js代码,所用时间是不同的,因为引入js地址,文件加载的时候需要通过通讯协议去解析地址,读取外部文件

    html文件在head标签中引入js地址和直接写js代码,所用时间是不同的,因为引入js地址,文件加载的时候需要通过通讯协议去解析地址,读取外部文件

  2. java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  3. 解决Requests中文乱码【有用】,读取htm文件 读取txt文件报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0

    打开这个网址https://blog.csdn.net/chaowanghn/article/details/54889835 python在open读取txt文件时,出现UnicodeDecodeE ...

  4. java实现xml文件读取并保存到对象

    首先浅聊一下解析xml的四种方式: 1.DOM方式:有缺点但是这个缺点却也是他的优点.下面详细介绍: 以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据.使用起来简单. 优点是 ...

  5. XML解析(一) DOM解析

    XML解析技术主要有三种: (1)DOM(Document Object Model)文档对象模型:是 W3C 组织推荐的解析XML 的一种方式,即官方的XML解析技术. (2)SAX(Simple ...

  6. 递归方式 DOM 解析(parse) XML

    friends.xml <span style="font-size:16px;"><?xml version="1.0" encoding= ...

  7. java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较

    1)DOM(JAXP Crimson解析器)     DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特 ...

  8. 深度学习_1_Tensorflow_2_数据_文件读取

    tensorflow 数据读取 队列和线程 文件读取, 图片处理 问题:大文件读取,读取速度, 在tensorflow中真正的多线程 子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全 ...

  9. C#生成PDF文档,读取TXT文件内容

    using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ...

随机推荐

  1. C#设计模式(1)-单例模式

    单例(Singleton)模式介绍 单例模式:也可以叫单件模式,官方定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一 ...

  2. java 内存模型的理解

    之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来.最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型. 本篇博客大 ...

  3. M3

    一,使用媒体查询的三种方式 1.直接在CSS中使用:   @media 类型:(长选用all/screen)and  (条件1)and(条件2){ CSS选择器{    CSS属性:属性值 } }   ...

  4. 使用struct模块从定宽数据文件导入数据

  5. C#委托和事件?策略模式?接口回调?还不清楚的赶紧来看我扯

    早前学习委托的时候,写过一点东西,今天带着新的思考和认知,再记点东西.这篇文章扯到设计模式中的策略模式,观察者模式,还有.NET的特性之一--委托.真的,请相信我,我只是在扯淡...... 场景练习 ...

  6. BPM与OA的区别及联系

    BPM与OA的区别及联系 近年来,在企业管理信息系统一些名词反复被提及,然而外行人对于这些名词则是一头雾水,网上的解释又鱼龙混杂,没有绝对权威的文献可供参考,因此也就让我们对这些名词的认识越来越模糊. ...

  7. chrome地址栏命令

    Chrome作为一个前端开发的标准浏览器,用来体验和测试日新月异的新特性,自然是没话说. 有些新特性是需要特意开启设置的,有很多浏览器的内置功能也是要通过命令来开启或者使用的. Chrome 有很多的 ...

  8. GDB教程

    GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调 ...

  9. SpringMVC注解@RequestMapping之produces属性导致的406错误

    废话不多说,各位,直接看图说话,敢吗?这个问题网上解决的办法写的狠是粗糙,甚至说这次我干掉它完全是靠巧合,但是也不否认网上针对406错误给出的解决方式,可能是多种情况下出现的406吧?我这次的流程就是 ...

  10. 【Centos7】安装memcached

    1.Linux系统安装memcached,首先要先安装libevent库. 安装libevent库有两种方式 (1)rpm安装 yum install libevent libdeve (2)源码包安 ...