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>
相关推荐
014-code1 分钟前
布隆过滤器:判断“可能存在“和“一定不存在“
java·redis
兔小盈3 分钟前
多线程篇-(二)线程创建、中断与终止
java·开发语言·多线程
jnrjian7 分钟前
Library Cache Load Lock library cache pins are replaced by mutexes
java·后端·spring
abcnull17 分钟前
传统的JavaWeb项目Demo快速学习!
java·servlet·elementui·vue·javaweb
risc12345622 分钟前
【lucene】PostingsEnum跟TermsEnum 的区别是啥?
java·lucene
AI砖家24 分钟前
Claude Code Superpowers 安装使用指南:让 AI 编程从“业余”走向“工程化”
前端·人工智能·python·ai编程·代码规范
李白的天不白36 分钟前
webpack 与axios 版本冲突问题
前端·webpack·node.js
小江的记录本40 分钟前
【Kafka核心】Kafka高性能的四大核心支柱:零拷贝、批量发送、页缓存、压缩
java·数据库·分布式·后端·缓存·kafka·rabbitmq
SamDeepThinking43 分钟前
程序员过35岁之前,应该完成的三件事
java·后端·程序员