版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40969422/article/details/80391734
<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
<Brand name="华为">
<type name="U8650"/>
<type name="HW123"/>
<type name="HW456"/>
</Brand>
<Brand name="苹果">
<type name="iphone6"/>
<type name="iphone6p"/>
<type name="iphone7"/>
</Brand>
</PhoneInfo>
package cn.dom;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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.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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*使用DOM解析文件
*/
public class ParseXMLDemo {
//收藏信息.xml对应的Document
private Document document;
public void getDom(){
//获得工厂解析器
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//根据解析器工厂获得解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//解析器来解析XML文件获得Document对象,一个路径下的文件
document=builder.parse("收藏信息.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取手机品牌相关信息
*/
public void showInfo(){
//以Document做起点,先拿到所有Brand节点
NodeList brands=document.getElementsByTagName("Brand");
//遍历brands,从中拿出每一个brand节点
//新方法,getLength()
for (int i = 0; i < brands.getLength(); i++) {
Node node=brands.item(i);
Element eleBrand=(Element) node;
//拿到属于brand的name
System.out.println(eleBrand.getAttribute("name"));
//继续往下,找每个Brand的子节点
NodeList types=eleBrand.getChildNodes();
for (int j = 0; j < types.getLength(); j++) {
Node typeNode=types.item(j);
//判断该子节点是否为元素节点
//Node.ELEMENT_NODE是否为元素
if(typeNode.getNodeType()==Node.ELEMENT_NODE){
Element eleType=(Element) typeNode;
System.out.println("\t"+eleType.getAttribute("name"));
}
}
}
}
/**
* 为XML文件添加元素
*/
public void addEle(){
//(1)创建<Brand name="三星">
Element brand=document.createElement("Brand");
//为<Brand>设置name属性取值为三星
brand.setAttribute("name", "三星");
//<Type name="NOTE2"/>
Element type = document.createElement("Type");
type.setAttribute("name", "NOTE2");
//将type作为Brand的子元素
brand.appendChild(type);
//将Brand放到PhoneInfo中去,位置为第一个PhoneInfo,item(0)
document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
saveXML("收藏信息.xml");
}
/**
* 保存XML文件(需借助转换器:源(最新DOM树)--》目的地(收藏信息.xml),借助输出流来实现)
*/
public void saveXML(String path){
//转换器工厂
TransformerFactory factory=TransformerFactory.newInstance();
//设置格式,首行缩进4个空格
factory.setAttribute("indent-number", 4);
try {
//转换器
Transformer transformer=factory.newTransformer();
//指定转换格式,ENCODING文字编码格式
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置准许缩进YES
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
//源(最新DOM树)-->目的地(收藏信息.xml)
DOMSource source=new DOMSource(document);
//传进一个要保存的文件地址path
OutputStream out=new FileOutputStream(path);
StreamResult result=new StreamResult(new OutputStreamWriter(out,"UTF-8"));
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 修改元素
* 给Brand添加id属性 值为下标+""一个空字符,String类型
*/
public void updateEle(){
//获得所有元素
NodeList brands=document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brand=brands.item(i);
Element brandEle=(Element) brand;
brandEle.setAttribute("id", i+"");
}
saveXML("收藏信息.xml");
}
/**
* 删除华为手机
*/
public void deleteEle(){
NodeList brands=document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brand=brands.item(i);
Element brandEle=(Element) brand;
if(brandEle.getAttribute("name").equals("华为")){
//用父类节点删除子节点
brandEle.getParentNode().removeChild(brandEle);
}
}
saveXML("收藏信息.xml");
}
}
package cn.dom;
public class Test {
public static void main(String[] args) {
ParseXMLDemo pd=new ParseXMLDemo();
pd.getDom();
//pd.addEle();
//pd.updateEle();
pd.deleteEle();
pd.showInfo();
}
}
Element:XML文档中的一个元素 | String getTagName | 获取元素名称 |
常用接口 | 常用方法 | 说明 |
Document:表示整个XML文档 | NodeList getElementsByTagName(String Tag) |
按文档顺序返回文档中指定标记名称的所有元素集合 |
Element createElement(String tagName) | 创建指定标记名称的元素 | |
Node:该文档树中的单个节点 | NodeList getChildNodes() | 获取该元素所有子节点,返回节点集合 |