目录
1、DOM解析XML
(1)DOM介绍
(2)常用接口介绍
(3)DOM解析XML文件步骤
(4)保存XML文件步骤
(5)查询输出XML文件中的信息
(6)向XML文件中添加数据
(7)删除xml文件里面的数据
(8)修改XML里面的数据
2、DOM4J解析XML
1、DOM解析XML
(1)DOM介绍
文档对象模型(Document Object Model)
DOM把XML文档映射成一个倒挂的树
示例:
(2)常用接口介绍
DOM解析包:org.w3c.dom
(3)DOM解析XML文件步骤
1)创建解析器工厂对象
2)解析器工厂对象创建解析器对象
3)解析器对象指定XML文件创建Document对象
操作DOM树
Document document;
// 声明方法获得Document对象的
public void getDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
document = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
(4)保存XML文件步骤
1)获得TransformerFactory对象
2)创建Transformer对象
3)创建DOMSource对象
包含XML信息
4)设置输出属性
编码格式
5)创建StreamResult对象
包含保存文件的信息
6)将XML保存到指定文件中
//声明保存XML的方法
public void saveXml(String url){
//保存XML文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new FileOutputStream(url));
//把DOM转换为XML文件
transformer.transform(domSource, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
(5)查询输出XML文件中的信息
public void printInfo() {
// 获取收藏信息.xml文件中所有的Brand元素,可能会获取多个,所以将获取的元素存放在NodeList集合中
NodeList nl = document.getElementsByTagName("Brand");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Node node = nl.item(i);
Element brand = (Element) node;
String nameVlue = brand.getAttribute("name");
System.out.println(nameVlue);
NodeList typeNodes = brand.getChildNodes();
for (int j = 0; j < typeNodes.getLength(); j++) {
Node typeNode = typeNodes.item(j);
// 类型判断,如果typeNode能够转换成Element,才进行转换和输出
if (typeNode.getNodeType() == Node.ELEMENT_NODE) {
Element type = (Element) typeNode;
String typeValue = type.getAttribute("name");
System.out.println("\t" + typeValue);
}
}
}
}
(6)向XML文件中添加数据
//声明向XML文件中添加数据的方法
public void addXml(){
//创建Brand节点
Element brandElement = document.createElement("Brand");
brandElement.setAttribute("name", "MOTO");
//创建Type节点
Element typeElement = document.createElement("Type");
typeElement.setAttribute("name", "A1680");
//添加父子关系
brandElement.appendChild(typeElement);
Element phoneElement = (Element)document.getElementsByTagName("PhoneInfo").item(0);
phoneElement.appendChild(brandElement);
//添加完毕之后要保存XML文件
saveXml("收藏信息.xml");
}
(7)删除xml文件里面的数据
//删除xml文件里面的数据
public void deleteXml(){
//找到删除的节点
NodeList list = document.getElementsByTagName("Brand");
for (int i = 0; i < list.getLength(); i++) {
Element brandElement = (Element)list.item(i);
String brandName = brandElement.getAttribute("name");
if (brandName.equals("摩托罗拉")) {
brandElement.getParentNode().removeChild(brandElement);
}
}
saveXml("收藏信息.xml");
}
(8)修改XML里面的数据
//修改XML里面的数据
public void updateXml(){
//找到修改的节点
NodeList list = document.getElementsByTagName("Brand");
for (int i = 0; i < list.getLength(); i++) {
Element brandElement = (Element)list.item(i);
String brandName = brandElement.getAttribute("name");
if (brandName.equals("MOTO")) {
brandElement.setAttribute("name", "摩托罗拉");//修改属性值
}
}
saveXml("收藏信息.xml");
}
2、DOM4J解析XML
首先,下载dom4j的jar包,免费的下载官网:dom4j下载官网
然后导入到项目里,Build Path为可用文件
举例说明使用方法:
package cn.bdqn.demo03;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jXMLDemo01 {
public static Document doc;
public static void main(String[] args) {
loadDocument();
// showPhoneInfo();
addNewPhoneInfo();
// updatePhoneInfo();
// deleteItem();
showPhoneInfo();
}
public static void loadDocument(){
try{
SAXReader saxReader = new SAXReader();
doc = saxReader.read(new File("收藏信息.xml"));
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void updatePhoneInfo(){
// 获取XML的根节点
Element root = doc.getRootElement();
int id = 0;
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
id++;
brand.addAttribute("id", id + "");
}
saveXML("收藏信息.xml");
}
public static void deleteItem(){
// 获取XML的根节点
Element root = doc.getRootElement();
int id = 0;
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
if (brand.attributeValue("name").equals("华为")) {
brand.getParent().remove(brand);
}
}
saveXML("收藏信息.xml");
}
public static void showPhoneInfo() {
// 获取XML的根节点
Element root = doc.getRootElement();
// 遍历所有的Brand标签
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
// 输出标签的name属性
System.out.println("品牌:" + brand.attributeValue("name"));
// 遍历Type标签
for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
Element type = (Element) itType.next();
// 输出标签的name属性
System.out.println("\t型号:" + type.attributeValue("name"));
}
}
}
public static void saveXML(String path){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML编码
XMLWriter writer;
writer = new XMLWriter(new FileWriter(path), format);
writer.write(doc);
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void addNewPhoneInfo(){
// 获取XML的根节点
Element root = doc.getRootElement();
// 创建Brand标签
Element el = root.addElement("Brand");
// 给Brand标签设置属性
el.addAttribute("name", "三星");
// 创建Type标签
Element typeEl = el.addElement("Type");
// 给Type标签设置属性
typeEl.addAttribute("name", "Note4");
saveXML("收藏信息.xml");
}
}