使用DOM解析XML文件,读取xml文件,保存xml,增加节点,修改节点属性,删除节点

时间:2022-06-29 05:14:50

 

目录

使用的xml文件      

整体代码       

获得DOM树。

保存xml文件

xml文件显示到控制台

添加节点

修改节点属性

删除节点

主方法

 

使用的xml文件

<?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");

}