XML简介
xml是Extensible Markup Language的缩写,即可扩展标记语言,是一种简单的存储语言,使用一系列简单的标记来描述结构化数据
XML的特点
- XML与操作系统、编程语言的开发平台都无关
- 规范统一,实现不同系统之间的数据交互
使用DOM读取XML数据
使用DOM解析XML文档的步骤:
- 创建解析器工厂对象,即DocumentBuilderFactory对象
- 由解析器工厂对象创建解析器对象,即DocumentBuilder对象
- 由解析器对象指定的XML文件进行解析,构建相应的DOM树,创建Document对象
- 以Document对象为起点对DOM树的节点进行增加、删除、修改、查询等操作
查询操作示例
package ch02.shili0203;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
/**
* @author 崔书健
* @date 2024/6/27
*/
public class XMLParse {
public static void main(String[] args) {
try {
// 1、得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2、从DOM工厂获得DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
// 3、解析XML文档,得到一个DocumentBuilder()
Document doc = db.parse("src/main/java/ch02/shili0203/Brand.xml");
// 4、获取新闻
NodeList list = doc.getElementsByTagName("pubdate");
Element pubDateElement = (Element) list.item(0);
// 5、读取文本节点
String pubDate = pubDateElement.getFirstChild().getNodeValue();
System.out.println(pubDate);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
增加操作示例
package ch02.shili04;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author 崔书健
* @date 2024/6/28
*/
public class XMLParse {
public static void main(String[] args) {
try {
// 得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document,即DOM树
Document doc = db.parse("src/main/java/ch02/shili0203/Brand.xml");
// 创建Brand节点
Element brandElement = doc.createElement("Brand");
brandElement.setAttribute("name","三星");
// 创建Type节点
Element typeElement = doc.createElement("Type");
typeElement.setAttribute("name","NoteX");
// 添加父子关系
brandElement.appendChild(typeElement);
Element phoneElement = (Element) doc.getElementsByTagName("PhoneInfo").item(0);
phoneElement.appendChild(brandElement);
// 保存XML文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
// 设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
StreamResult result = new StreamResult(new FileOutputStream("src/main/java/ch02/shili0203/Brand.xml"));
// 把DOM树转换为XML文件
transformer.transform(domSource,result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
修改操作示例
package ch02.shili05;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author 崔书健
* @date 2024/6/28
*/
public class XMLParse {
public static void main(String[] args) {
try {
// 构建DOM树
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("src/main/java/ch02/shili0203/Brand.xml");
// 找到修改的节点
NodeList list = doc.getElementsByTagName("Brand");
for (int i = 0; i < list.getLength(); i++) {
Element brandElement = (Element) list.item(i);
String brandName = brandElement.getAttribute("name");
// 如果name属性值为三星,则进行修改
if (brandName.equals("三星")){
brandElement.setAttribute("name","SAMSUNG");// 修改属性
}
}
// 保存XML文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
// 设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
StreamResult result = new StreamResult(new FileOutputStream("src/main/java/ch02/shili0203/Brand.xml"));
// 把DOM树转换为XML文件
transformer.transform(domSource,result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
删除操作示例
package ch02.shili06;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* @author 崔书健
* @date 2024/6/28
*/
public class XMLParse {
public static void main(String[] args) {
try {
// 构建DOM树
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("src/main/java/ch02/shili0203/Brand.xml");
// 找到要删除的节点
NodeList list = doc.getElementsByTagName("Brand");
for (int i = 0; i < list.getLength(); i++) {
Element brandElement = (Element) list.item(i);
String brandName = brandElement.getAttribute("name");
// 找到name属性为SAMSUNG的节点,删除
if (brandName.equals("SAMSUNG")){
// 调用父节点的removeChild()方法删除
brandElement.getParentNode().removeChild(brandElement);
}
}
// 保存xml文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
// 设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
StreamResult result = new StreamResult(new FileOutputStream("src/main/java/ch02/shili0203/Brand.xml"));
// 把DOM树转换为XML文件
transformer.transform(domSource,result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
使用DOM4J解析XML
示例代码
package ch02.shizhan;
import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.Document;
import java.io.*;
import java.util.Iterator;
import java.util.List;
/**
* @author 崔书健
* @date 2024/7/1
*/
public class XMlParser {
public static void main(String[] args) {
try {
// // 获取DOM树
// DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// DocumentBuilder db = dbf.newDocumentBuilder();
// Document doc = db.parse("src/main/java/ch02/shizhan01/手机收藏.xml");
// 加载DOM树
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read("src/main/java/ch02/shizhan01/手机收藏.xml");
// 查询
select(doc);
// 添加
add(doc);
// 修改
upd(doc);
// 删除
del(doc);
// NodeList nodeList = doc.getElementsByTagName("Brand");
// for (int i = 0; i < nodeList.getLength(); i++) {
// Element brandEle = (Element) nodeList.item(i);
// String name = brandEle.getAttribute("name");
// System.out.println("name:" + name);
// NodeList nodeListEle = brandEle.getChildNodes();
// for (int j = 0; j < nodeListEle.getLength(); j++) {
// Node node = nodeListEle.item(j);
// if (node.getNodeType() == Node.ELEMENT_NODE){
// Element childEle = (Element) node;
// String nameChild = childEle.getAttribute("name");
// System.out.println("\t子元素name:" + nameChild);
// }
// }
// }
// // 添加
// add(doc);
// // 修改
// upd(doc);
// // 删除
// del(doc);
} /*catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}*/ catch (DocumentException e) {
e.printStackTrace();
}
}
// /**
// * 保存XML文件
// * @param doc DOM树
// */
// public static void saveXML(Document doc){
// try {
// // 保存XML文件
// TransformerFactory transformerFactory = TransformerFactory.newInstance();
// Transformer transformer = transformerFactory.newTransformer();
// DOMSource domSource = new DOMSource(doc);
// // 设置编码类型
// transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");
// StreamResult result = new StreamResult(new FileOutputStream("src/main/java/ch02/shizhan01/手机收藏.xml"));
// // 把DOM树转换为XML文件
// transformer.transform(domSource,result);
// } catch (TransformerConfigurationException e) {
// e.printStackTrace();
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (TransformerException e) {
// e.printStackTrace();
// }
// }
public static void saveXML(Document doc){
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
try {
XMLWriter writer = new XMLWriter(new FileWriter("src/main/java/ch02/shizhan01/手机收藏.xml"));
writer.write(doc);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void select(Document doc){
Element root = doc.getRootElement();
List brands = root.elements("Brand");
Iterator iterator = brands.iterator();
while (iterator.hasNext()){
Element elm = (Element) iterator.next();
Attribute attribute = elm.attribute("name");
System.out.println("name:" + attribute.getText());
for (Iterator itType = elm.elementIterator(); itType.hasNext() ;) {
Element typeEle = (Element) itType.next();
Attribute attributeType = typeEle.attribute("name");
System.out.println("\t子元素name:" + attributeType.getText());
}
}
}
public static void add(Document doc){
// 获取根元素
Element root = doc.getRootElement();
// 创建Brand元素
Element brandElm = root.addElement("Brand");
// 为Brand元素添加name属性
brandElm.addAttribute("name","三星");
// 新建Type元素
Element typeElm = brandElm.addElement("Type");
typeElm.addAttribute("name","NoteX");
saveXML(doc);
System.out.println("添加成功!");
}
public static void upd(Document doc){
Element root = doc.getRootElement();
List brands = root.elements("Brand");
Iterator iterator = brands.iterator();
while (iterator.hasNext()){
Element elm = (Element) iterator.next();
Attribute attribute = elm.attribute("name");
String name = attribute.getText();
if (name.equals("三星")){
attribute.setText("SAMSUNG");
}
}
saveXML(doc);
System.out.println("修改成功!");
}
public static void del(Document doc){
Element root = doc.getRootElement();
List brands = root.elements("Brand");
Iterator iterator = brands.iterator();
while (iterator.hasNext()){
Element elm = (Element) iterator.next();
Attribute attribute = elm.attribute("name");
String name = attribute.getText();
if (name.equals("SAMSUNG")){
Element parent = elm.getParent();
parent.remove(elm);
}
}
saveXML(doc);
System.out.println("删除成功!");
}
// public static void add(Document doc){
// // 创建Brand节点
// Element brandEle = doc.createElement("Brand");
// brandEle.setAttribute("name","三星");
// // 创建Type节点
// Element typeEle = doc.createElement("Type");
// typeEle.setAttribute("name","NoteX");
// // 添加父子关系
// brandEle.appendChild(typeEle);
// Element phoneElement = (Element) doc.getElementsByTagName("PhoneInfo").item(0);
// phoneElement.appendChild(brandEle);
// saveXML(doc);
// System.out.println("添加成功!");
// }
// public static void upd(Document doc){
// NodeList nodeList = doc.getElementsByTagName("Brand");
// for (int i = 0; i < nodeList.getLength(); i++) {
// Element brandEle = (Element) nodeList.item(i);
// String name = brandEle.getAttribute("name");
// if ("三星".equals(name)){
// brandEle.setAttribute("name","SAMSUNG");
// }
// }
// saveXML(doc);
// System.out.println("修改成功!");
// }
// public static void del(Document doc){
// NodeList nodeList = doc.getElementsByTagName("Brand");
// for (int i = 0; i < nodeList.getLength(); i++) {
// Element brandEle = (Element) nodeList.item(i);
// String name = brandEle.getAttribute("name");
// if ("SAMSUNG".equals(name)){
// brandEle.getParentNode().removeChild(brandEle);
// }
// }
// saveXML(doc);
// System.out.println("删除成功!");
// }
}