XML配置文件
目录(单击跳转对应目录)
1.XML总介................................................................. 1
1.1发展历史........................................................................... 1
1.2为什么要使用XML........................................................ 2
2.XML的语法............................................................ 3
2.1入门案例用XML来记录一个班级的信息............................................................. 3
2.2语法详解................................................................... 3
2.3 DTD讲解..................................................................... 5
2.4 DTD细节部分................................................... 7
2.5学习DTD的目标.......................................................... 11
3.XML的增删改查................................................................. 13
3.1XML也有DOM树.................................................................... 13
3.2XML操作查询值................................................................. 14
3.3XML操作添加................................................................... 16
3.4XML操作删除................................................... 20
3.5删除属性.............................................. 22
3.6 XML更新..................................................................... 24
4.SAX解析.................................................................... 27
4.1为什么出现SAX技术............................. 27
4.2实际案例................................................. 27
4.3另一个案例...................................................... 29
5.DOM4J.............................................. 31
5.1为什么会有DOM4J技术呢......................................... 31
5.2快速入门案例增删改查............................................... 32
6.XPATH........................................................................ 36
6.1为什么需要XPATH....................................................... 36
6.2具体案例.................................................... 36
1.XML总介
1.1发展历史
1969GML-1985SGML-1993HTML-1998XML
GML通用标记语言[主要目的在不同的机器上进行通讯] 。SGML标准通用标记语言。HTML万维网 W3 本身是有一些缺陷的。
XML 可扩展标记语言Extensible Markup Language为解决问题而生。
1.2为什么要使用XML
1.2.1.数据传送格式的实际需要
1.2.2.配置文件的时候使用
如逆向、POM、WEB等等
1.2.3用于现实中复杂关系的描述
1.2.4应用总结
2.XML的语法
2.1入门案例用XML来记录一个班级的信息
<?xml version="1.0" encoding="UTF-8"?>
<class>
<student id="001">
<name>刘备</name>
<sex>男</sex>
<age>30</age>
</student>
<student id="002">
<name>关羽</name>
<sex>男</sex>
<age>28</age>
</student>
</class>
<!-- 特别说明 <?xml version="1.0" encoding="UTF-8"?>是告知浏览器是UTF-8编码,如果是text文件也有自己的编码,注意保持一致。 -->
2.2语法详解
2.2.1总体说明
2.2.2相关说明
2.2.3 注释
<!-- 班级 -->
2.2.4CDATA节
<?xml version="1.0" encoding="UTF-8"?>
<!-- 班级 -->
<class>
<student id="001" >
<name>刘备</name>
<sex>男</sex>
<age>30</age>
<image><![CDATA[头像<<....!!!''']]></image>
</student>
<student id="002">
<name>关羽</name>
<sex>男</sex>
<age>28</age>
</student>
</class>
<!-- 如何使用xml文件去传递小图片?
可以把文件读成一个byte数组,放到CDATA节里面再传递 -->
2.2.5处理指令(了解即可)
2.2.6小结
2.3 DTD讲解
2.3.1作用
2.3.2XML和DTD的关系
<?xml version="1.0" encoding="UTF-8"?>
<!-- 班级 -->
<!-- 如何不让成员里非法插入面积标签 -->
<class>
<student id="001" >
<name>刘备</name>
<sex>男</sex>
<age>30</age>
<image><![CDATA[头像<<....!!!''']]></image>
<面积>100平</面积>
</student>
<student id="002">
<name>关羽</name>
<sex>男</sex>
<age>28</age>
</student>
</class>
2.3.3DTD简单编写
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT class (student+)>
<!ELEMENT student (name,sex,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
2.3.4限制后的XML
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd约束 -->
<!DOCTYPE class SYSTEM "MyDTD.dtd">
<!-- 班级 -->
<class>
<student>
<name>刘备</name>
<sex>男</sex>
<age>30</age>
<!-- <面积>100平</面积> -->
</student>
<student>
<name>关羽</name>
<sex>男</sex>
<age>28</age>
</student>
</class>
2.3.5不用Eclipes的效验工具
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>验证工具</title>
<script type="text/javascript">
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.validateOnParse = "true";//开启效验
xmldoc.load("MyXml.xml");//校验文件装载
document.writeln(xmldoc.parseError.reason);
document.writeln(xmldoc.parseError.line);
</script>
</head>
<body>
</body>
</html>
2.4 DTD细节部分
2.4.1文档声明和引用。尽量使用外部DTD
2.4.2 DTD元素
2.4.3DTD属性
基本语法
<!ATTLIST 元素名
属性名 类型 特点
>
2.4.4元素定义
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT class (student+)>
<!--定义某个元素的属性-->
<!ELEMENT student (name,sex,age)>
<!ATTLIST student
studentId CDATA #REQUIRED
>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
可以给可以不给
<!ATTLIST student
studentId CDATA #IMPLIED
>
指定固定值
<!ATTLIST student
studentId CDATA #FIXED "003"
>
2.4.5 ID和 IDREF,多个使用IDREFS中间空格隔开
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT class (student+)>
<!--定义某个元素的属性-->
<!ELEMENT student (name,sex,age)>
<!ATTLIST student
studentId CDATA #FIXED "003"
学号 ID #REQUIRED
大哥 IDREF #REQUIRED
>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
2.4.6必须的XML
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd约束 -->
<!DOCTYPE class SYSTEM "MyDTD.dtd">
<!-- 班级 -->
<class>
<student studentId="003" 学号="sp003" 大哥="sp003">
<name>刘备</name>
<sex>男</sex>
<age>30</age>
</student>
<student studentId="003" 学号="sp004" 大哥="sp004">
<name>关羽</name>
<sex>男</sex>
<age>29</age>
</student>
</class>
2.4.7定义几种属性
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd约束 -->
<!DOCTYPE class SYSTEM "MyDTD.dtd">
<!-- 班级 -->
<class>
<student studentId="003" 学号="sp003" 大哥="sp003" 性别="男">
<name>刘备</name>
<sex>男</sex>
<age>30</age>
</student>
<student studentId="003" 学号="sp004" 大哥="sp004" 性别="男">
<name>关羽</name>
<sex>男</sex>
<age>29</age>
</student>
</class>
2.4.8实体
2.4.9 XML中引用实体
DTD
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT class (student+)>
<!--定义某个元素的属性-->
<!ELEMENT student (name,sex,age)>
<!ATTLIST student
studentId CDATA #FIXED "003"
学号 ID #REQUIRED
大哥 IDREF #REQUIRED
性别 (男|女) #REQUIRED
>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ENTITY myCopy "我的公司版权">
XML文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd约束 -->
<!DOCTYPE class SYSTEM "MyDTD.dtd">
<!-- 班级 -->
<class>
<student studentId="003" 学号="sp003" 大哥="sp003" 性别="男">
<name>刘备</name>
<sex>男</sex>
<age>30 &myCopy;</age>
</student>
<student studentId="003" 学号="sp004" 大哥="sp004" 性别="女">
<name>关羽</name>
<sex>男 &myCopy;</sex>
<age>29</age>
</student>
</class>
效果
2.4.10 DTD引用实体
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT class (student+)>
<!ENTITY % myName "name">
<!--定义某个元素的属性-->
<!ELEMENT student (%myName;,sex,age)>
<!ATTLIST student
studentId CDATA #FIXED "003"
学号 ID #REQUIRED
大哥 IDREF #REQUIRED
性别 (男|女) #REQUIRED
>
<!ELEMENT %myName; (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ENTITY myCopy "我的公司版权">
2.5学习DTD的目标
2.5.1根据DTD要求写出对应的XML文件
2.5.2写出的XML
3.XML的增删改查
3.1XML也有DOM树
3.2XML操作查询值
3.2.1XML
<?xml version="1.0" encoding="UTF-8"?>
<class>
<student id="001" sex="男">
<name>刘备</name>
<sex>男</sex>
<age>30</age>
</student>
<student id="002">
<name>关羽</name>
<sex>男</sex>
<age>29</age>
</student>
</class>
3.2.2 JAVA文件代码
package surface;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class MyXmlMake{
public static void main(String args[]) throws Exception{
//使用dom技术对xml进行增删改查工作
//创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通过工厂DocumentBuilderFactory得到一个DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//指定解析那个xml文件
Document document=db.parse("src/main/webapp/MyXml.xml");
//System.out.println(document);
studentSelect(document);
}
//遍历xml文件
public static void myList(Node node){
//如果非元素节点不打印出来
if(node.getNodeType()==node.ELEMENT_NODE){
System.err.println("取到元素"+node.getNodeName());
}
//出去node的子node
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//显示
Node nodeTemp=nodeList.item(i);
myList(nodeTemp);
}
}
//具体查询第一个学生的信息
public static void studentSelect(Document document){
NodeList nodeList=document.getElementsByTagName("student");
//System.out.println("发现"+nodeList.getLength()+"个学生");
//取出第一个同学的node
Node studentNode=nodeList.item(0);
//做一次转换(父-子)
Element studentNodeElement=(Element) studentNode;
//如何获取某个元素的属性值
System.out.println(studentNodeElement.getAttribute("sex"));
Element name=(Element) studentNodeElement.getElementsByTagName("name").item(0);
System.err.println(name.getTextContent());
}
}
3.2.3运行结果
3.3XML操作添加
3.3.1JAVA文件XML文件不变
package surface;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//使用dom技术对xml进行增删改查工作
//创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通过工厂DocumentBuilderFactory得到一个DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//指定解析那个xml文件
Document document=db.parse("src/main/webapp/MyXml.xml");
//System.out.println(document);
//studentSelect(document);
studentUpdate(document);
System.out.println("插入成功");
}
//遍历xml文件
public static void myList(Node node){
//如果非元素节点不打印出来
if(node.getNodeType()==node.ELEMENT_NODE){
System.err.println("取到元素"+node.getNodeName());
}
//出去node的子node
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//显示
Node nodeTemp=nodeList.item(i);
myList(nodeTemp);
}
}
//具体查询第一个学生的信息
public static void studentSelect(Document document){
NodeList nodeList=document.getElementsByTagName("student");
//System.out.println("发现"+nodeList.getLength()+"个学生");
//取出第一个同学的node
Node studentNode=nodeList.item(0);
//做一次转换(父-子)
Element studentNodeElement=(Element) studentNode;
//如何获取某个元素的属性值
System.out.println(studentNodeElement.getAttribute("sex"));
Element name=(Element) studentNodeElement.getElementsByTagName("name").item(0);
System.err.println(name.getTextContent());
}
//添加一个学生到xml文件中
public static void studentUpdate(Document document) throws Exception{
//创建一个新的学生节点
Element newStudent=document.createElement("student");
Element newStudentName=document.createElement("name");
newStudentName.setTextContent("张飞");
Element newStudentSex=document.createElement("sex");
newStudentSex.setTextContent("男");
Element newStudentAge=document.createElement("age");
newStudentAge.setTextContent("27");
newStudent.appendChild(newStudentName);
newStudent.appendChild(newStudentSex);
newStudent.appendChild(newStudentAge);
//把新的学生节点添加到根元素下
document.getDocumentElement().appendChild(newStudent);
//得到工厂TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
}
3.3.2执行后结果
3.3.3添加属性
package surface;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//使用dom技术对xml进行增删改查工作
//创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通过工厂DocumentBuilderFactory得到一个DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//指定解析那个xml文件
Document document=db.parse("src/main/webapp/MyXml.xml");
//System.out.println(document);
//studentSelect(document);
studentUpdate(document);
System.out.println("插入成功");
}
//遍历xml文件
public static void myList(Node node){
//如果非元素节点不打印出来
if(node.getNodeType()==node.ELEMENT_NODE){
System.err.println("取到元素"+node.getNodeName());
}
//出去node的子node
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//显示
Node nodeTemp=nodeList.item(i);
myList(nodeTemp);
}
}
//具体查询第一个学生的信息
public static void studentSelect(Document document){
NodeList nodeList=document.getElementsByTagName("student");
//System.out.println("发现"+nodeList.getLength()+"个学生");
//取出第一个同学的node
Node studentNode=nodeList.item(0);
//做一次转换(父-子)
Element studentNodeElement=(Element) studentNode;
//如何获取某个元素的属性值
System.out.println(studentNodeElement.getAttribute("sex"));
Element name=(Element) studentNodeElement.getElementsByTagName("name").item(0);
System.err.println(name.getTextContent());
}
//添加一个学生到xml文件中
public static void studentUpdate(Document document) throws Exception{
//创建一个新的学生节点
Element newStudent=document.createElement("student");
//添加一个属性值
newStudent.setAttribute("ID", "007");
Element newStudentName=document.createElement("name");
newStudentName.setTextContent("张飞");
Element newStudentSex=document.createElement("sex");
newStudentSex.setTextContent("男");
Element newStudentAge=document.createElement("age");
newStudentAge.setTextContent("27");
newStudent.appendChild(newStudentName);
newStudent.appendChild(newStudentSex);
newStudent.appendChild(newStudentAge);
//把新的学生节点添加到根元素下
document.getDocumentElement().appendChild(newStudent);
//得到工厂TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
}
3.4XML操作删除
package surface;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//使用dom技术对xml进行增删改查工作
//创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通过工厂DocumentBuilderFactory得到一个DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//指定解析那个xml文件
Document document=db.parse("src/main/webapp/MyXml.xml");
//System.out.println(document);
//studentSelect(document);
//studentUpdate(document);
//System.out.println("插入成功");
deleteStudent(document);
System.out.println("删除第一个学生成功");
}
//遍历xml文件
public static void myList(Node node){
//如果非元素节点不打印出来
if(node.getNodeType()==node.ELEMENT_NODE){
System.err.println("取到元素"+node.getNodeName());
}
//出去node的子node
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//显示
Node nodeTemp=nodeList.item(i);
myList(nodeTemp);
}
}
//具体查询第一个学生的信息
public static void studentSelect(Document document){
NodeList nodeList=document.getElementsByTagName("student");
//System.out.println("发现"+nodeList.getLength()+"个学生");
//取出第一个同学的node
Node studentNode=nodeList.item(0);
//做一次转换(父-子)
Element studentNodeElement=(Element) studentNode;
//如何获取某个元素的属性值
System.out.println(studentNodeElement.getAttribute("sex"));
Element name=(Element) studentNodeElement.getElementsByTagName("name").item(0);
System.err.println(name.getTextContent());
}
//添加一个学生到xml文件中
public static void studentUpdate(Document document) throws Exception{
//创建一个新的学生节点
Element newStudent=document.createElement("student");
//添加一个属性值
newStudent.setAttribute("ID", "007");
Element newStudentName=document.createElement("name");
newStudentName.setTextContent("张飞");
Element newStudentSex=document.createElement("sex");
newStudentSex.setTextContent("男");
Element newStudentAge=document.createElement("age");
newStudentAge.setTextContent("27");
newStudent.appendChild(newStudentName);
newStudent.appendChild(newStudentSex);
newStudent.appendChild(newStudentAge);
//把新的学生节点添加到根元素下
document.getDocumentElement().appendChild(newStudent);
//得到工厂TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
//删除第一个学生
public static void deleteStudent(Document document) throws Exception{
//找到这个学生
Node studentNode=document.getElementsByTagName("student").item(0);
studentNode.getParentNode().removeChild(studentNode);
//更新操作
mySubmit(document);
}
public static void mySubmit(Document document) throws Exception{
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
}
3.5删除属性
package surface;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//使用dom技术对xml进行增删改查工作
//创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通过工厂DocumentBuilderFactory得到一个DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//指定解析那个xml文件
Document document=db.parse("src/main/webapp/MyXml.xml");
//System.out.println(document);
//studentSelect(document);
//studentUpdate(document);
//System.out.println("插入成功");
deleteStudent(document);
System.out.println("删除第一个学生成功");
}
//遍历xml文件
public static void myList(Node node){
//如果非元素节点不打印出来
if(node.getNodeType()==node.ELEMENT_NODE){
System.err.println("取到元素"+node.getNodeName());
}
//出去node的子node
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//显示
Node nodeTemp=nodeList.item(i);
myList(nodeTemp);
}
}
//具体查询第一个学生的信息
public static void studentSelect(Document document){
NodeList nodeList=document.getElementsByTagName("student");
//System.out.println("发现"+nodeList.getLength()+"个学生");
//取出第一个同学的node
Node studentNode=nodeList.item(0);
//做一次转换(父-子)
Element studentNodeElement=(Element) studentNode;
//如何获取某个元素的属性值
System.out.println(studentNodeElement.getAttribute("sex"));
Element name=(Element) studentNodeElement.getElementsByTagName("name").item(0);
System.err.println(name.getTextContent());
}
//添加一个学生到xml文件中
public static void studentUpdate(Document document) throws Exception{
//创建一个新的学生节点
Element newStudent=document.createElement("student");
//添加一个属性值
newStudent.setAttribute("ID", "007");
Element newStudentName=document.createElement("name");
newStudentName.setTextContent("张飞");
Element newStudentSex=document.createElement("sex");
newStudentSex.setTextContent("男");
Element newStudentAge=document.createElement("age");
newStudentAge.setTextContent("27");
newStudent.appendChild(newStudentName);
newStudent.appendChild(newStudentSex);
newStudent.appendChild(newStudentAge);
//把新的学生节点添加到根元素下
document.getDocumentElement().appendChild(newStudent);
//得到工厂TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
//删除第一个学生
public static void deleteStudent(Document document) throws Exception{
//找到这个学生
//删除属性
Element studentElement=(Element) document.getElementsByTagName("student").item(0);
studentElement.removeAttribute("sex");
//更新操作
mySubmit(document);
}
public static void mySubmit(Document document) throws Exception{
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
}
3.6 XML更新
package surface;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//使用dom技术对xml进行增删改查工作
//创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通过工厂DocumentBuilderFactory得到一个DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//指定解析那个xml文件
Document document=db.parse("src/main/webapp/MyXml.xml");
//System.out.println(document);
//studentSelect(document);
//studentUpdate(document);
//System.out.println("插入成功");
//deleteStudent(document);
//System.out.println("删除第一个学生成功");
updateStudent(document);
System.out.println("修改第一个学生成功");
}
//遍历xml文件
public static void myList(Node node){
//如果非元素节点不打印出来
if(node.getNodeType()==node.ELEMENT_NODE){
System.err.println("取到元素"+node.getNodeName());
}
//出去node的子node
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//显示
Node nodeTemp=nodeList.item(i);
myList(nodeTemp);
}
}
//具体查询第一个学生的信息
public static void studentSelect(Document document){
NodeList nodeList=document.getElementsByTagName("student");
//System.out.println("发现"+nodeList.getLength()+"个学生");
//取出第一个同学的node
Node studentNode=nodeList.item(0);
//做一次转换(父-子)
Element studentNodeElement=(Element) studentNode;
//如何获取某个元素的属性值
System.out.println(studentNodeElement.getAttribute("sex"));
Element name=(Element) studentNodeElement.getElementsByTagName("name").item(0);
System.err.println(name.getTextContent());
}
//添加一个学生到xml文件中
public static void studentUpdate(Document document) throws Exception{
//创建一个新的学生节点
Element newStudent=document.createElement("student");
//添加一个属性值
newStudent.setAttribute("ID", "007");
Element newStudentName=document.createElement("name");
newStudentName.setTextContent("张飞");
Element newStudentSex=document.createElement("sex");
newStudentSex.setTextContent("男");
Element newStudentAge=document.createElement("age");
newStudentAge.setTextContent("27");
newStudent.appendChild(newStudentName);
newStudent.appendChild(newStudentSex);
newStudent.appendChild(newStudentAge);
//把新的学生节点添加到根元素下
document.getDocumentElement().appendChild(newStudent);
//得到工厂TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
//删除第一个学生
public static void deleteStudent(Document document) throws Exception{
//找到这个学生
//删除属性
Element studentElement=(Element) document.getElementsByTagName("student").item(0);
studentElement.removeAttribute("sex");
//更新操作
mySubmit(document);
}
//把刘备的名字改成曹操
public static void updateStudent(Document document) throws Exception{
Element studentElement=(Element) document.getElementsByTagName("student").item(0);
Element tempElement=(Element) studentElement.getElementsByTagName("name").item(0);
tempElement.setTextContent("曹操");
//修改属性
studentElement.setAttribute("sex", "女");
//更新操作
mySubmit(document);
}
public static void mySubmit(Document document) throws Exception{
TransformerFactory tff=TransformerFactory.newInstance();
//通过工厂得到一个转换器
Transformer tf=tff.newTransformer();
//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xml
tf.transform(new DOMSource(document),new StreamResult("src/main/webapp/MyXml.xml") );
}
}
4.SAX解析
4.1为什么出现SAX技术
4.1.1因为DOM会把整个XML加载到内存,如果XML过大,则会出现内存溢出
4.1.2SAX可以在不加载全部XML文件基础上就可以解析XML文档
4.2实际案例
4.2.1解析XML
package com.day.temp.test;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//创建SAXParserFactory
SAXParserFactory spf=SAXParserFactory.newInstance();
//创建SAXParser
SAXParser saxParser=spf.newSAXParser();
//把xml和事件处理对象关联起来
saxParser.parse("src/main/webapp/MyXml.xml", new MyHandler());
}
}
//定义事件处理类
class MyHandler extends DefaultHandler{
//发现文档
@Override
public void startDocument() throws SAXException {
System.out.println("发现文档startDocument() ");
super.startDocument();
}
//发现元素
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("发现元素="+qName);
//super.startElement(uri, localName, qName, attributes);
}
//发现文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//super.characters(ch, start, length);
//System.out.println(ch);
String tempString=new String(ch,start,length);
//遍历
if(!tempString.trim().equals("")){
System.out.println(tempString);
}
}
//发现元素结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
}
//发现文档结束
@Override
public void endDocument() throws SAXException {
System.out.println("发现文档结束endDocument() ");
super.endDocument();
}
}
4.3另一个案例
4.3.1只查找学生的名字和年龄
package com.day.temp.test;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class MyXmlDo{
public static void main(String args[]) throws Exception{
//创建SAXParserFactory
SAXParserFactory spf=SAXParserFactory.newInstance();
//创建SAXParser
SAXParser saxParser=spf.newSAXParser();
//把xml和事件处理对象关联起来
saxParser.parse("src/main/webapp/MyXml.xml", new MyHandlerTwo());
}
}
//定义事件处理类
class MyHandler extends DefaultHandler{
//发现文档
@Override
public void startDocument() throws SAXException {
System.out.println("发现文档startDocument() ");
super.startDocument();
}
//发现元素
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("发现元素="+qName);
//super.startElement(uri, localName, qName, attributes);
}
//发现文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//super.characters(ch, start, length);
//System.out.println(ch);
String tempString=new String(ch,start,length);
//遍历
if(!tempString.trim().equals("")){
System.out.println(tempString);
}
}
//发现元素结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
}
//发现文档结束
@Override
public void endDocument() throws SAXException {
System.out.println("发现文档结束endDocument() ");
super.endDocument();
}
}
//第二个事件处理器
class MyHandlerTwo extends DefaultHandler{
private boolean isName=false;
private boolean isAge=false;
//发现文档
@Override
public void startDocument() throws SAXException {
System.out.println("发现文档startDocument() ");
//super.startDocument();
}
//发现元素
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//System.out.println("发现元素值为"+qName);
//super.startElement(uri, localName, qName, attributes);
if(qName.equals("name")){
this.isName=true;
}else if(qName.equals("age")){
this.isAge=true;
}
}
//发现文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String tempString=new String(ch,start,length);
//遍历
if(!tempString.trim().equals("")&&(isName||isAge)){
System.out.println(tempString);
}
isName=false;
isAge=false;
}
//发现元素结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
}
//发现文档结束
@Override
public void endDocument() throws SAXException {
System.out.println("发现文档结束endDocument() ");
super.endDocument();
}
}
4.3.2替换空白行小技巧
4.3.2.1^s*
—选择Regular expression项,允许查询匹配正则表达式。点击替换所有就可以了。
4.3.2.2Word也可以替换空表行Ctrl+H然后^p^p替换为^p
4.3.3对SAX的说明
4.3.3.1主要对XML文件读取,不能修改/增加/删除XML文件
4.3.3.2是推的机制,把发现的内容告知程序员。程序员自己决定如何处理。
5.DOM4J
5.1为什么会有DOM4J技术呢
5.1.1 DOM缺点是耗费内存
5.1.2 SAX确定只能读取,无法增删改
5.1.3所以DOM4J应用而生,可以提高效率又可以增删改查
5.1.4 Dom4j开发需要单独引包
5.2快速入门案例增删改查
5.2.1增删改查JAVA代码
package com.day.temp.test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4j {
//dom4j的增删改查
public static void main(String args[]) throws Exception{
//得到一个解析器
SAXReader saxReader=new SAXReader();
//指定解析xml文件
Document document=saxReader.read(new File("src/main/webapp/MyXml.xml"));
//dom4jList(document.getRootElement());//getRootElement其实就是得到根元素
//dom4jSelect(document);
//dom4jSelectAttribute(document);
//dom4jInsert(document);
//System.out.println("添加新学生成功");
//dom4jDelete(document);
//System.out.println("删除学生成功");
dom4jDeleteAttribute(document);
//dom4jUpdate(document);
System.out.println("成功");
}
//遍历xml文件
public static void dom4jList(Element element){
System.out.println(element.getName()+" "+element.getTextTrim());
Iterator iterator=element.elementIterator();
while(iterator.hasNext()){
Element temp=(Element) iterator.next();
//递归
dom4jList(temp);
}
}
//指定查某一个学生
public static void dom4jSelect(Document document){
//得到根元素
Element rootElement=document.getRootElement();
//rootElement.elements("student")表示取出root元素下所有学生元素,get(0)表示的取第一个
//rootElement.element表示取出root元素下第一个元素
//无法跨级别取 只能从1级取2级 2级取3级
Element sonElement=(Element) rootElement.elements("student").get(0);
System.out.println(sonElement.element("name").getText()+" "+sonElement.element("age").getText()
+" "+sonElement.element("sex").getText());
//也可以写成sonElement.elements("name").get(0);
}
//取属性
public static void dom4jSelectAttribute(Document document){
Element rootElement=document.getRootElement();
Element studentName=(Element) rootElement.elements("student").get(0);
//这个阶段取属性
System.out.println(studentName.attributeValue("id")+" "+studentName.attributeValue("sex"));
}
//添加元素 添加一个学生
public static void dom4jInsert(Document document) throws Exception{
//创建一个学生元素对象
Element newStudent=DocumentHelper.createElement("student");
Element newStudentName=DocumentHelper.createElement("name");
Element newStudentAge=DocumentHelper.createElement("age");
Element newStudentSex=DocumentHelper.createElement("sex");
//设置元素文本值
newStudentName.setText("无名小将");
newStudentAge.setText("22");
newStudentSex.setText("男");
//子元素归属到父元素newStudent
newStudent.add(newStudentName);
newStudent.add(newStudentAge);
newStudent.add(newStudentSex);
//再把学生加到根元素
document.getRootElement().add(newStudent);
//更新到xml文件
XMLWriter xmlWriter=new XMLWriter(new FileWriter ("src/main/webapp/MyXml.xml"));
xmlWriter.write(document);
xmlWriter.close();
}
//删除
public static void dom4jDelete(Document document) throws Exception{
//找到
Element student=(Element) document.getRootElement().elements("student").get(3);
//删除
student.getParent().remove(student);
//更新到xml文件
XMLWriter xmlWriter=new XMLWriter(new FileWriter ("src/main/webapp/MyXml.xml"));
xmlWriter.write(document);
xmlWriter.close();
}
//删除元素
public static void dom4jDeleteAttribute(Document document) throws Exception{
//找到
Element student=(Element) document.getRootElement().elements("student").get(0);
//删除
//System.err.println(student.attribute("id").getValue());
//student.attribute("id").setValue(arg0);//更新属性的
student.addAttribute("group", "蜀国");//设置新的属性
student.remove(student.attribute("id"));
//更新到xml文件
XMLWriter xmlWriter=new XMLWriter(new FileWriter ("src/main/webapp/MyXml.xml"));
xmlWriter.write(document);
xmlWriter.close();
}
//更新元素 把所有学生年龄+3
public static void dom4jUpdate(Document document) throws Exception{
//遍历下
/*for(int i=0;i<3;i++){
Element student=(Element) document.getRootElement().elements("student").get(i);
int temp=Integer.parseInt(student.element("age").getText())-3;
student.element("age").setText(temp+"");
}*/
List<Element> studentList=document.getRootElement().elements("student");
for(Element student:studentList){
int temp=Integer.parseInt(student.element("age").getText())-3;
student.element("age").setText(temp+"");
}
//更新到xml文件
XMLWriter xmlWriter=new XMLWriter(new FileWriter ("src/main/webapp/MyXml.xml"));
xmlWriter.write(document);
xmlWriter.close();
}
}
5.2.2指定位置插入元素
package com.day.temp.test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4j {
//dom4j的增删改查
public static void main(String args[]) throws Exception{
//得到一个解析器
SAXReader saxReader=new SAXReader();
//指定解析xml文件
Document document=saxReader.read(new File("src/main/webapp/MyXml.xml"));
//dom4jUpdate(document);
dom4jUpdateByIndex(document);
System.out.println("成功");
}
public static void xmlUpdate(Document document) throws Exception{
//更新到xml文件
XMLWriter xmlWriter=new XMLWriter(new FileWriter ("src/main/webapp/MyXml.xml"));
xmlWriter.write(document);
xmlWriter.close();
}
public static void dom4jUpdateByIndex(Document document) throws Exception{
Element newStudent=DocumentHelper.createElement("student");
newStudent.setText("林冲");
List<Element> students=document.getRootElement().elements("student");
students.add(1, newStudent);
xmlUpdate(document);
}
}
6.XPATH
6.1为什么需要XPATH
6.1.1因为DOM4J无法跨级别取元素
6.1.2XPATH就是为了方便访问任何级别节点
6.1.3原理图往往是和DOM4J一起使用
6.2具体案例
6.2.1需要添加必要的包
<!-- 添加DOM4J包学习XML的时候额外添加的 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- 添加XPath需要的包 -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
6.2.2案例的JAVA代码
package com.day.temp.test;
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class XPath {
public static void main(String[] args) throws Exception {
//得到一个解析器
SAXReader saxReader=new SAXReader();
//指定解析xml文件
Document document=saxReader.read(new File("src/main/webapp/MyXml.xml"));
//可以使用XPath随便取了
//List<Element> tempElementList=document.selectNodes("/AAA");//返回多个元素 document.selectSingleNode(arg0)只返回一个
//List<Element> tempElementList=document.selectNodes("/AAA/CCC");
//List<Element> tempElementList=document.selectNodes("/AAA/DDD/BBB");
//List<Element> tempElementList=document.selectNodes("//BBB");
//List<Element> tempElementList=document.selectNodes("//DDD/BBB");//找出父元素是DDD的BBB
//List<Element> tempElementList=document.selectNodes("/AAA/CCC/DDD/*");
//List<Element> tempElementList=document.selectNodes("/*/*/*/BBB");//所有有三个上级元素的BB
//List<Element> tempElementList=document.selectNodes("//*");//所有都被入选
/*List<Element> tempElementList=document.selectNodes("/AAA/BBB[1]");//折表示AAA下面的第一个BBB元素
这个动作就可以对DOM4J中更改某个元素的值提供了很方便的方法了
for(Element tempElement:tempElementList){
//System.err.println(tempElement.getText());
System.err.println(tempElement.getName());
}*/
/BBB[@id]所有有id属性的BBB元素
BBB[@id="007"]选择所有id属性且值邓毅007的BBB元素
List<Attribute> tempAttributeList=document.selectNodes("//@id");//这里属性返回的和元素的类型就不同了
for(Attribute tempAttribute:tempAttributeList){
//System.err.println(tempElement.getText());
System.err.println(tempAttribute.getName());
}
}
}
6.2.3XML文件配置
<?xml version="1.0" encoding="UTF-8"?>
<AAA id="007">
<BBB>第一个BBB</BBB>
<CCC></CCC>
<BBB>第二个BBB</BBB>
<BBB></BBB>
<DDD>
<BBB>第四个BBB</BBB>
</DDD>
<CCC>
<DDD>
<BBB>第四个BBB</BBB>
<BBB>第四个BBB</BBB>
<BBB>第四个BBB</BBB>
</DDD>
</CCC>
</AAA>
XML从入门到精通
王者鳜錸2024-05-03 17:11