XML从入门到精通

复制代码
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>
相关推荐
傻小胖2 分钟前
React 生命周期完整指南
前端·react.js
Q_19284999068 分钟前
基于Spring Boot的个人健康管理系统
java·spring boot·后端
梦境之冢41 分钟前
axios 常见的content-type、responseType有哪些?
前端·javascript·http
racerun44 分钟前
vue VueResource & axios
前端·javascript·vue.js
m0_748245171 小时前
Web第一次作业
java
小码的头发丝、1 小时前
Java进阶学习笔记|面向对象
java·笔记·学习
m0_548514771 小时前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
AndrewPerfect1 小时前
xss csrf怎么预防?
前端·xss·csrf
Calm5501 小时前
Vue3:uv-upload图片上传
前端·vue.js
浮游本尊1 小时前
Nginx配置:如何在一个域名下运行两个网站
前端·javascript