XML文件解析–DOM&DOM4J
一.DOM
前提:获取Document
1.创造解析器工厂对象
DocumentBuilderFactory【类】. newInstance( )【方法】
2.解析器工厂对象创造解析器对象
工厂.newDocumentBuilder( ) 【方法】
3.解析器对象解析XML文件,创建Document对象
解析器.parse(“photoInfo.xml”) 【方法】
查看XML文件信息
1.(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName(“Brand”);【返回节点集合】
2.遍历brands,从中拿到每个Brand
for循环中:brands.item(i);【获取每个节点】
将节点强转为元素 Element elsBrand=(Element)node;
获得元素的属性 String brandName = elsBrand.getAttribute(“name”); 【返回值为字符串】
寻找子节点
获取每个节点的子节点集合
NodeList typys = elsBrand.getChildNodes(); //通过节点对象的getChildNodes()方法
for循环中:brands.item(i);【获取每个节点】
Node typenode=typys.item(j)
判断子节点是否为元素节点
if判断typenode.getNodeType()==Node.ELEMENT_NODE
将节点强转为元素 Element eltype=(Element)typenode
增加元素
1.创建Brand
Element brand=dcm.createElement(“Brand”);
2.为Brand设置属性name
brand.setAttribute(“name”, “三星”)
3.设置子元素
(1).创建type
Element type=dcm.createElement(“type”);
(2).为Brand设置属性name
type.setAttribute(“name”, “XR”);
4.将子元素type放在Brand中
brand.appendChild(type);
5.将brand放在dcm
获取上一级元素,再放入
dcm.getElementsByTagName(“photoinfo”).item(0).appendChild(brand);
6.保存在XML中(调用保存方法)
添加到XlM文件中(借助转换器:源(最新的Document)–>目的地;借助输出流)
1.创建转换器工厂
TransformerFactory fac=TransformerFactory.newInstance();
(2)设置缩进
fac.setAttribute(“indent-number”, 4); //设置退4格
2.创建转换器
Transformer transformar=fac.newTransformer();
(2)设置转换格式
transformar.setOutputProperty(OutputKeys.ENCODING,“UTF-8”); //关键字转换设定
transformar.setOutputProperty(OutputKeys.INDENT,“YES”); //退格设置
3.源(最新的Document)–>目的地;借助输出流)
transformar.transform(source,ru); //前提需要DOMSource类的源,StreamResult类的地址
(2)DOMSource类的源
DOMSource source=new DOMSource(dcm); //将DOM树转换为DOMSource类
(3)StreamResult类的地址
OutputStream out = new FileOutputStream(path); //字节输出流
StreamResult ru = new StreamResult(new OutputStreamWriter(out,“UTF-8”));
修改元素
1.(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName(“Brand”);【返回节点集合】
2.遍历brands,从中拿到每个Brand
for循环中:brands.item(i);【获取每个节点】
将节点强转为元素 Element elsBrand=(Element)node;
设置元素新属性
elbrand.setAttribute(“id”, i+"");
3.保存在XML中(调用保存方法)
删除元素
1.(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName(“Brand”);【返回节点集合】
2.遍历brands,从中拿到每个Brand
for循环中:brands.item(i);【获取每个节点】
将节点强转为元素 Element elsBrand=(Element)node;
if判断元素的属性是否为寻找的元素属性一致
元素的父节点删除该元素
elbrand.getParentNode().removeChild(elbrand);
3.保存在XML中(调用保存方法)
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解析XML文件
public class paresXMLDemo {
//属性xml对应的Document(方便后续操作)
private Document dcm;
// private Node item;
//获取Document
public void getdom() {
//1.创造解析器工厂对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//2.解析器工厂对象创造解析器对象
try {
DocumentBuilder builder=factory.newDocumentBuilder();
//3.解析器对象解析XML文件,创建Document对象
dcm=builder.parse("photoInfo.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
}catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//获取手机的品牌和型号信息
public void showInfo() {
//Document起点,(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName("Brand");
//遍历brands,从中拿到每个Brand
for (int i = 0; i < brands.getLength(); i++) {
Node node = brands.item(i); //NodeList特有方法
Element elsBrand=(Element)node; //将节点转换为元素
String brandName = elsBrand.getAttribute("name"); //获得元素的属性
System.out.println(brandName);
//继续查找每个Brand的子节点
NodeList typys = elsBrand.getChildNodes();
for (int j = 0; j < typys.getLength(); j++) {
Node typenode=typys.item(j);
//判断该子节点是否为元素节点
if(typenode.getNodeType()==Node.ELEMENT_NODE) {
Element eltype=(Element)typenode;
System.out.println("\t"+eltype.getAttribute("name"));
}
}
}
}
//增加元素
public void addElement() {
//1.创建Brand
Element brand=dcm.createElement("Brand");
//2.为Brand设置属性name
brand.setAttribute("name", "三星");
//设置子元素
Element type=dcm.createElement("type");
type.setAttribute("name", "XR");
//将子元素type放在Brand中
brand.appendChild(type);
//将brand放在dcm
dcm.getElementsByTagName("photoinfo").item(0).appendChild(brand);
//保存在XML中
saveXML("photoInfo.xml");
}
//添加到XlM文件中(借助转换器:源(最新的Document)-->目的地;借助输出流)
public void saveXML(String path) {
//转换器工厂
TransformerFactory fac=TransformerFactory.newInstance();
//设置缩进
fac.setAttribute("indent-number", 4);
//转换器
try {
Transformer transformar=fac.newTransformer();
//设置转换格式
transformar.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
transformar.setOutputProperty(OutputKeys.INDENT,"YES");
//源(最新的Document)-->目的地;借助输出流
DOMSource source=new DOMSource(dcm);
OutputStream out = new FileOutputStream(path);
StreamResult ru = new StreamResult(new OutputStreamWriter(out,"UTF-8"));
transformar.transform(source,ru);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
//修改元素
public void updateEle() {
//获取所有的Brand
NodeList brands=dcm.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brand=brands.item(i);
Element elbrand=(Element)brand;
elbrand.setAttribute("id", i+"");
}
saveXML("photoInfo.xml");
}
//删除元素
public void deleteEle() {
//获取所有的Brand
NodeList brands=dcm.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brand=brands.item(i);
Element elbrand=(Element)brand;
if(elbrand.getAttribute("name").equals("华为")) {
elbrand.getParentNode().removeChild(elbrand);
}
}
saveXML("photoInfo.xml");
}
public static void main(String[] args) {
paresXMLDemo pd=new paresXMLDemo();
pd.getdom();
pd.deleteEle();
pd.addElement();
pd.updateEle();
pd.showInfo();
}
}
二.DOM4J
要导入DOM4J的jar包
前提:获取Document
1.获取解析器
SAXReader saxReader=new SAXReader();
2.解析文件
dcm=saxReader.read(“photoInfo.xml”) //read方法
查看手机信息
1.获取根元素
Element root = dcm.getRootElement();
2.获取子元素的
(1)获取子元素的迭代器
(2)获取每一个子元素
(3)获取<孙元素>
迭代器
获取每一个
增加一个元素
1.获取根元素
Element root = dcm.getRootElement();
2.创建并传入子元素
(1)Element elebrand=root.addElement(“brand”);
(2)设置子元素属性
elebrand.addAttribute(“name”, “华为”);
3.创建并传入孙元素
(1)Element eletype=elebrand.addElement(“type”);
(2)设置孙元素属性
eletype.addAttribute(“name”, “HW123”);
4.调用保存方法
保存到XML文件中
1.创建转换器
(1).OutputFormat format=OutputFormat.createPrettyPrint();
(2).设置编码格式
format.setEncoding(“UTF-8”);
2.输出
(1).创造输出的“流”
XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream(path),“UTF-8”),format);
(2).将DOM树输出
writer.write(dcm);
3.关流
修改元素
1.获取根元素
Element root = dcm.getRootElement();
2.获取子元素的
(1)获取子元素的迭代器
(2)获取每一个子元素
(3)设置元素属性
brand.addAttribute(“id”, id+" ");
3.调用保存方法
删除节点
1.获取根元素
Element root = dcm.getRootElement();
2.获取子元素的
(1)获取子元素的迭代器
(2)获取每一个子元素
(3)if判断元素的属性是否为寻找的元素属性一致
brand.attributeValue(“name”).equals(“三星”)
元素的父节点删除该元素
brand.getParent().remove(brand);
3.调用保存方法
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 java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class DOM4Jdome {
private Document dcm;
//获得Document对象
public void getdcm() {
//相当于获取解析器
SAXReader saxReader=new SAXReader();
try {
//解析XML文件
dcm=saxReader.read("photoInfo.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
}
//显示手机信息
public void showInfo() {
//获取XML的根节点<photoInfo>
Element root = dcm.getRootElement();
//获取所有的子元素<Brand>
Iterator elebrand = root.elementIterator();
while(elebrand.hasNext()) {
Element brand=(Element)elebrand.next();
System.out.println(brand.attributeValue("name"));
//获得子元素<type>
Iterator eletype = brand.elementIterator();
while(eletype.hasNext()) {
Element type=(Element)eletype.next();
System.out.println("\t"+type.attributeValue("name"));
}
}
}
//增加一个元素
private void addEle() {
//获得根元素
Element root = dcm.getRootElement();
//创建<brand>
Element elebrand=root.addElement("brand");
elebrand.addAttribute("name", "华为");
//创建<type>
Element eletype=elebrand.addElement("type");
eletype.addAttribute("name", "HW123");
saveXML("photoInfo.xml");
}
//保存到XML中
private void saveXML(String path) {
//相当于转换器
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=null;
try {
writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream(path),"UTF-8"),format);
writer.write(dcm);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
};
}
//修改节点
private void updateinfo() {
Element root=dcm.getRootElement();
Iterator elebrand = root.elementIterator();
int id=0;
while(elebrand.hasNext()) {
Element brand=(Element)elebrand.next();
id++;
brand.addAttribute("id", id+" ");
}
saveXML("photoInfo.xml");
}
//删除节点
private void deletele() {
Element root = dcm.getRootElement();
Iterator elebrand = root.elementIterator();
while(elebrand.hasNext()) {
Element brand=(Element)elebrand.next();
if(brand.attributeValue("name").equals("三星")) {
brand.getParent().remove(brand);
}
}
saveXML("photoInfo.xml");
}
public static void main(String[] args) {
DOM4Jdome dp=new DOM4Jdome();
dp.getdcm();
dp.showInfo();
dp.addEle();
dp.updateinfo();
dp.deletele();
dp.showInfo();
}
}