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