XML简介
XML(EXtensible Markup Language),可扩展标记语言
特点
XML与操作系统、编程语言的开发平台无关
实现不同系统之间的数据交换
作用
数据交互
配置应用程序和网站
Ajax基石
XML标签:XML文档内容由一系列标签元素组成
语法:<元素名 属性名=“属性值”>元素内容</元素名>
XML编写注意事项
所有XML元素都必须有结束标签
XML标签对大小写敏感
XML必须正确的嵌套
同级标签以缩进对齐
元素名称可以包含字母、数字或其他的字符
元素名称不能以数字或者标点符号开始 元素名称中不能含空格
XML文档结构
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student stuId="1001">
<name>张三</name>
<age>19</age>
<gender>男</gender>
</student>
<student stuId="1002">
<name>李四</name>
<age>19</age>
<gender>男</gender>
</student>
</students>
XML解析器
解析器类型
非验证解析器
检查文档格式是否良好
验证解析器
使用DTD检查文档的有效性
解析XML技术
DOM
基于XML文档树结构的解析
适用于多次访问的XML文档
特点:比较消耗资源
SAX
基于事件的解析
适用于大数据量的XML文档
特点:占用资源少,内存消耗小
DOM4J
非常优秀的Java XML API
性能优异、功能强大
开放源代码
DOM解析XML
DOM解析XML文件步骤
1.创建解析器工厂对象
2.解析器工厂对象创建解析器对象
3.解析器对象指定XML文件创建Document对象
4.以Document对象为起点操作DOM树
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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;
public class Demo {
public static void main(String[] args) {
//获取解析器工场对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
//使用解析器工场对象获得解析器对象
DocumentBuilder db=dbf.newDocumentBuilder();
//使用解析器对象将XML文件转换为Document对象
Document document=db.parse("收藏信息.xml");
//获取收藏信息.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(" "+typeValue);
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
保存XML文件
步骤
- 获得TransformerFactory对象
- 创建Transformer对象
- 创建DOMSource对象 包含XML信
- 息 设置输出属性 编码格式
- 创建StreamResult对象 包含保存文件的信息
- 将XML保存到指定文件中
//保存XML文件
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource domSource=new DOMSource(doc);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建StreamResult对象
StreamResult result=new StreamResult(new FileOutputStream("收藏信息2.xml"));
//把DOM转换为XML文件
transformer.transform(domSource, result);
添加DOM节点
import java.io.FileOutputStream;
import java.io.IOException;
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.xml.sax.SAXException;
public class ParseXMLDemo {
public static void main(String[] args) {
/*
* 在XML文档中添加品牌为“MOTO”,型号为“A1680”的手机收藏信息
*
* 分析如下:
* 首先,根据收藏信息在内存中构建出它的DOM树,要在PhoneInfo的节点上添加品牌节点,需要先找到PhoneInfo节点。
* 然后再此DOM树上创建一个新的Brand品牌节点,设置它的属性name为“MOTO”。
* 然后根据它在DOM树的位置,把他添加为PhoneInfo的子节点。这样,此DOM树就有了新的结构。
* 最后把这个DOM树结构保存到XML文件就可以了。
* 实现步骤如下:
* (1)为XML文档构造DOM树
* (2)创建新节点,并设置name属性
* (3)把节点加到其所属父节点上
* (4)保存XML文档
*/
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse("收藏信息2.xml");
//创建Brand节点
Element brandElement=doc.createElement("Brand");
brandElement.setAttribute("name", "MOTO");
//创建Type节点
Element typeElement=doc.createElement("Type");
typeElement.setAttribute("name", "A1680");
//添加为父子关系
brandElement.appendChild(typeElement);
Element phoneElement=(Element)doc.getElementsByTagName("PhoneInfo").item(0);
phoneElement.appendChild(brandElement);
//保存XML文件
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource domSource=new DOMSource(doc);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建StreamResult对象
StreamResult result=new StreamResult(new FileOutputStream("收藏信息2.xml"));
//把DOM转换为XML文件
transformer.transform(domSource, result);
System.out.println("数据添加成功");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
修改DOM节点
import java.io.FileOutputStream;
import java.io.IOException;
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;
public class ParseXMLDemo {
public static void main(String[] args) {
/*
* 示例06:将保存手机收藏信息的XML文档中的手机品牌信息MOTO修改为“摩托罗拉”。
*
* 实现步骤如下:
* (1)为XML文档构造DOM树
* (2)找到符合修改条件的节点
* (3)设置该节点的属性为修改值
* (4)保存XML文档
* 分析如下:
* 手机收藏信息的修改仍然要先构建DOM树,要把品牌信息MOTO修改为“摩托罗拉”,
* 先要找到属性为MOTO的Brand节点,然后把name属性设置为“摩托罗拉”,
* 最后将DOM树的修改保存到XML文件中
*/
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档,得到一个Document对象
Document doc=db.parse("收藏信息3.xml");
//找到修改的节点
NodeList nl=doc.getElementsByTagName("Brand");
//遍历找到元素
for (int i = 0; i < nl.getLength(); i++) {
Node node=nl.item(i);
Element brandElement=(Element)node;
String brandName=brandElement.getAttribute("name");
if(brandName.equals("MOTO")){
brandElement.setAttribute("name","摩托罗拉");
}
}
//保存文件
TransformerFactory df=TransformerFactory.newInstance();
Transformer transformer=df.newTransformer();
DOMSource domSource=new DOMSource(doc);
//设置编码
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建StreamResult对象
StreamResult result=new StreamResult(new FileOutputStream("收藏信息3.xml"));
//将DOM转换为XML文件
transformer.transform(domSource, result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
删除DOM节点
import java.io.FileOutputStream;
import java.io.IOException;
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;
public class ParseXMLDemo {
public static void main(String[] args) {
//得到DOM解析器的工厂实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档,得到一个Document对象
Document doc=db.parse("收藏信息4.xml");
//找到删除的节点
NodeList nl=doc.getElementsByTagName("Brand");
//遍历找到节点
for (int i = 0; i <nl.getLength(); i++) {
Node node=nl.item(i);
Element brandElement=(Element)node;
String brandName=brandElement.getAttribute("name");
if(brandName.equals("摩托罗拉")){
brandElement.getParentNode().removeChild(brandElement);
}
}
//保存XML文件
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
DOMSource domSource=new DOMSource(doc);
//设置编码
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建StreamResult对象
StreamResult result=new StreamResult(new FileOutputStream("收藏信息4.xml"));
//将DOM转换为XML文件
transformer.transform(domSource, result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
DOM4J解析XML
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 Dmo4j {
public static Document doc;
public static void main(String[] args) {
loadDocument();
// showPhoneInfo();
addNewPhoneInfo();
// saveXML("新收藏.xml");
// 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("src/收藏信息.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("src/收藏信息.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");
}
}