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具体案例.................................................... 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《QT实用小工具·五十》动态增删数据与平滑缩放移动的折线图

1、概述 源码放在文章末尾 该项目实现了带动画、带交互的折线图&#xff0c;包含如下特点&#xff1a; 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点…

Qt 配置 FFmpeg

进入 GitHub&#xff0c;下载带 shared 后缀的那个包即可 我将下载好的文件夹改名为 FFmpeg并将 FFmpeg 文件夹放在 Program Files 目录下 下载好后将 bin 添加到系统环境中 C:\Program Files\FFmpeg\bin若用 QMake 构建项目 在配置文件 pro 中 添加到文件末尾就行 FFMPEG_HO…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-PWR电源控制

PWR简介 PVD可用在电池供电或安全要求比较高的设备&#xff0c;如果供电电压在逐渐下降&#xff0c;在电压过低的情况下可能会导致内外电路出现不确定的错误。为了避免不必要的错误&#xff0c;可以在电源电压过低的情况下&#xff0c;提前发出警告并关闭较为危险的设备 关闭的…

Java发送请求-http+https的

第一步&#xff1a;建议ssl连接对象&#xff0c;信任所有证书 第二步&#xff1a;代码同时支持httphttps 引入源码类 是一个注册器 引入这个类&#xff0c;和它的方法create 注册器&#xff0c;所以对http和https都进行注册&#xff0c;参数为id和item&#xff0c;其中http的…

【C++题解】1039. 求三个数的最大数

问题&#xff1a;1039. 求三个数的最大数 类型&#xff1a;多分支结构 题目描述&#xff1a; 已知有三个不等的数&#xff0c;将其中的最大数找出来。 输入&#xff1a; 输入只有一行&#xff0c;包括3个整数。之间用一个空格分开。 输出&#xff1a; 输出只有一行&#…

uni-app scroll-view隐藏滚动条的小细节 兼容主流浏览器

开端 想写个横向滚动的列表适配浏览器&#xff0c;主要就是隐藏一下滚动条在手机上美观一点。 但是使用uni-app官方文档建议的::-webkit-scrollbar在目标标签时发现没生效。 .scroll-view_H::-webkit-scrollbar{display: none; }解决 F12看了一下&#xff0c;原来编译到浏览…

Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueue BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 生产者消费者模式 生产者:产生数据的线程。消费者:使用数据的线程。 &#xff08;Thread1生产者&#xff0c;Thread2消费者&#xff09; 实现类 ArrayBlockingQueueLinkedBlockingQueuePr…

MariaDB远程访问2点的事情

1、MariaDB库本身的配置 vim /etc/mysql/mariadb.conf.d/50-server.cnf 中的 ....... [mysqld] bind-address 127.0.0.1 ....... 改成 [mysqld] bind-address 0.0.0.0 2、mysql 进到MariaDB中&#xff0c;用户表&#xff0c;用户的的访问主机&#xff0c;得是% ----…

firebase:一款功能强大的Firebase数据库安全漏洞与错误配置检测工具

关于firebase firebase是一款针对Firebase数据库的安全工具&#xff0c;该工具基于Python 3开发&#xff0c;可以帮助广大研究人员针对目标Firebase数据库执行安全漏洞扫描、漏洞测试和错误配置检测等任务。 该工具专为红队研究人员设计&#xff0c;请在获得授权许可后再进行安…

制作一个RISC-V的操作系统十六-系统调用

文章目录 用户态和内核态mstatus设置模式切换核心流程封装代码背景解释代码示例解析解释目的 用户态和内核态 mstatus设置 此时UIE设置为1和MPIE为1&#xff0c;MPP设置为0 代表当前权限允许UIE中断发生&#xff0c;并且在第一个mret后将权限恢复为用户态&#xff0c;同时MIE也…

关于适配器模式这一篇就够了

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个接口与另一个不兼容的接口协同工作。在适配器模式中&#xff0c;我们创建一个适配器类&#xff0c;该类将不兼容的接口转换为客户端所期望的接口&#xff0c;从而使客户端能够使用…

Wpf DataGrid ComboBox 列

遇到的问题 最开始找到的例子要写 Convert, 感觉和 Vue-Elment 的差别比较大后面找到类似与 Vue-Element UI 的写法&#xff0c;开始时数值不更新 关键代码 <DataGridTemplateColumn Header"Digit" Width"100"><DataGridTemplateColumn.CellTem…

保存钉钉群直播回放下载:直播回放下载步骤详解

今天&#xff0c;我们就来拨开云雾&#xff0c;揭开保存钉钉群直播回放的神秘面纱。教会你们如何下载钉钉群直播回放 首先用到的工具我全部打包好了&#xff0c;有需要的自己下载一下 钉钉群直播回放工具下载&#xff1a;https://pan.baidu.com/s/1WVMNGoKcTwR_NDpvFP2O2A?p…

Ubuntu安装Docker和Docker Compose

文章目录 Docker安装Docker Compose安装示例前端Dockerfile示例 Docker官网&#xff1a; https://docs.docker.com/ Docker镜像仓库&#xff1a; https://hub.docker.com/ Docker安装 安装curl(可选) 如果已经安装了curl&#xff0c;则跳过此步骤 # 更新包缓存 sudo apt u…

9、开发基于FemWorkbench的CFD模块

CFD求解器设计针对FreeCAD 背景与动机&#xff1a;SolidWorks不仅提供了FEM功能&#xff0c;还具备CFD功能。为了使FreeCAD拥有类似的功能&#xff0c;考虑在现有的Fem Workbench上添加CFD功能&#xff0c;并重用大部分基础设施。 CFD模拟需求&#xff1a;CFD模拟需要复杂的设…

ubuntu22.04版本操作系统安装docker

安装 Docker 在 Ubuntu 22.04 上与其他 Ubuntu 版本大致相同。以下是在 Ubuntu 22.04 上安装 Docker 的步骤&#xff1a; 1. 更新软件包列表&#xff1a; 确保您的系统已更新到最新的软件包列表。在终端中运行以下命令&#xff1a; sudo apt update2. 安装依赖工具&#xff…

ASP.NET Core日志管理(Serilog)

.net 6 web api项目添加日志(Serilog)管理,将日志输出到控制台、文件、数据库 Nuget安装:Serilog.AspNetCore 1、用于日志输出到控制台Serilog.Formatting.Compact 2、用于日志输出到SQLServer数据库Serilog.Sinks.MSSqlServer 3、用于日志输出到文件Serilog.Sinks.RollingF…

pycharm中文件误删或者误操作,怎么恢复

恢复pycharm中文件误删或者误操作 恢复方法&#xff1a;1.xxxx.py文件误删2.xxxx.py文件内操作 在日常学习或练手时总会有一些迷之操作&#xff0c;一些文件被误删或者一些文件越改越糟&#xff0c;想要恢复操作之前的文件。 恢复方法&#xff1a; 1.选则误删文件的上级目录&…

mysql 数据转excel文件

mysql 数据转excel文件 缘由 为售后拉取数据&#xff0c;用navicat太墨迹了&#xff0c;用python写一个main方法跑一下&#xff1b; 1.抽取共同方法&#xff0c;封装成传入mysql&#xff0c;直接下载成excel&#xff1b; 2.写入所有sql语句&#xff0c;传入参数&#xff1b; 代…

Linux内核深入学习 - 内核同步

目录 内核抢占 同步原语 per-CPU变量 API Per CPU 变量的应用 per CPU 变量在多文件下的用法 原子操作 API 优化和内存屏障 自旋锁 自旋锁 API 函数 读写锁 API RCU 信号量 API 1. 信号量的结构&#xff1a; 2. 初始化函数sema_init 3. 可中断获取信号量函数…