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具体案例.................................................... 361.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 studentstudentId CDATA #REQUIRED
> 
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
可以给可以不给
<!ATTLIST studentstudentId CDATA #IMPLIED
> 
指定固定值
<!ATTLIST studentstudentId 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 studentstudentId 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 studentstudentId 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 studentstudentId 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进行增删改查工作//创建一个DocumentBuilderFactoryDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//通过工厂DocumentBuilderFactory得到一个DocumentBuilderDocumentBuilder 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的子nodeNodeList 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()+"个学生");//取出第一个同学的nodeNode 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进行增删改查工作//创建一个DocumentBuilderFactoryDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//通过工厂DocumentBuilderFactory得到一个DocumentBuilderDocumentBuilder 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的子nodeNodeList 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()+"个学生");//取出第一个同学的nodeNode 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);//得到工厂TransformerFactoryTransformerFactory tff=TransformerFactory.newInstance();//通过工厂得到一个转换器Transformer tf=tff.newTransformer();//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xmltf.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进行增删改查工作//创建一个DocumentBuilderFactoryDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//通过工厂DocumentBuilderFactory得到一个DocumentBuilderDocumentBuilder 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的子nodeNodeList 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()+"个学生");//取出第一个同学的nodeNode 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);//得到工厂TransformerFactoryTransformerFactory tff=TransformerFactory.newInstance();//通过工厂得到一个转换器Transformer tf=tff.newTransformer();//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xmltf.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进行增删改查工作//创建一个DocumentBuilderFactoryDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//通过工厂DocumentBuilderFactory得到一个DocumentBuilderDocumentBuilder 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的子nodeNodeList 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()+"个学生");//取出第一个同学的nodeNode 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);//得到工厂TransformerFactoryTransformerFactory tff=TransformerFactory.newInstance();//通过工厂得到一个转换器Transformer tf=tff.newTransformer();//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xmltf.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") 定义路径,可以是新的xmltf.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进行增删改查工作//创建一个DocumentBuilderFactoryDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//通过工厂DocumentBuilderFactory得到一个DocumentBuilderDocumentBuilder 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的子nodeNodeList 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()+"个学生");//取出第一个同学的nodeNode 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);//得到工厂TransformerFactoryTransformerFactory tff=TransformerFactory.newInstance();//通过工厂得到一个转换器Transformer tf=tff.newTransformer();//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xmltf.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") 定义路径,可以是新的xmltf.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进行增删改查工作//创建一个DocumentBuilderFactoryDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//通过工厂DocumentBuilderFactory得到一个DocumentBuilderDocumentBuilder 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的子nodeNodeList 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()+"个学生");//取出第一个同学的nodeNode 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);//得到工厂TransformerFactoryTransformerFactory tff=TransformerFactory.newInstance();//通过工厂得到一个转换器Transformer tf=tff.newTransformer();//new StreamResult("src/main/webapp/MyXml.xml") 定义路径,可以是新的xmltf.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") 定义路径,可以是新的xmltf.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{//创建SAXParserFactorySAXParserFactory spf=SAXParserFactory.newInstance(); //创建SAXParserSAXParser saxParser=spf.newSAXParser();//把xml和事件处理对象关联起来saxParser.parse("src/main/webapp/MyXml.xml", new MyHandler());}
}
//定义事件处理类
class MyHandler extends DefaultHandler{//发现文档@Overridepublic void startDocument() throws SAXException {System.out.println("发现文档startDocument() ");super.startDocument();}//发现元素@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("发现元素="+qName);//super.startElement(uri, localName, qName, attributes);}//发现文本@Overridepublic 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);}}//发现元素结束@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(uri, localName, qName);}//发现文档结束@Overridepublic 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{//创建SAXParserFactorySAXParserFactory spf=SAXParserFactory.newInstance(); //创建SAXParserSAXParser saxParser=spf.newSAXParser();//把xml和事件处理对象关联起来saxParser.parse("src/main/webapp/MyXml.xml", new MyHandlerTwo());}
}
//定义事件处理类
class MyHandler extends DefaultHandler{//发现文档@Overridepublic void startDocument() throws SAXException {System.out.println("发现文档startDocument() ");super.startDocument();}//发现元素@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {System.out.println("发现元素="+qName);//super.startElement(uri, localName, qName, attributes);}//发现文本@Overridepublic 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);}}//发现元素结束@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(uri, localName, qName);}//发现文档结束@Overridepublic void endDocument() throws SAXException {System.out.println("发现文档结束endDocument() ");super.endDocument();}
}
//第二个事件处理器
class MyHandlerTwo extends DefaultHandler{private boolean isName=false;private boolean isAge=false;//发现文档@Overridepublic void startDocument() throws SAXException {System.out.println("发现文档startDocument() ");//super.startDocument();}//发现元素@Overridepublic 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;}}//发现文本@Overridepublic 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;}//发现元素结束@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(uri, localName, qName);}//发现文档结束@Overridepublic 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("男");//子元素归属到父元素newStudentnewStudent.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();}//更新元素  把所有学生年龄+3public 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>