Java Web入门基础(XML之二)

1.schema约束

                ***dtd语法:<!ElEMENT 元素名称 约束>

                ***schema符合xml的语法,xml结构

                ***一个xml中,只有一个dtd,可以有多个schema使用命名空间进行区分(类似于java包名)

                ***dtd中有PCDATA类型,但是在schema里面可以支持更多的数据类型

                                 ----比如,年龄只能是参数,在schema可以直接定义一个整数类型

                 ***schema语法复杂,目前不能替代dtd,两种并行使用

2schema快速入门

                 ****创建一个schema文件  后缀名  .xsd

                                          ***根节点<schema></schema>

               *****在一个schema里面

                           ***属性:

                              xmlns="http://www.w3.org/2001/XMLSchema"

                              ----表示当前xml文件是一个约束文件

                             targetNamespace="http://www.example.org/1" 

                             ----使用schema约束文件,直接通过这个地址引入这个约束文件

                            elementFormDefault="qualified"

<schema xmlns="http://www.w3.org/2001/XMLSchema"             //约束文件
targetNamespace="http://www.example.org/1"                   //引入约束文件使用这个地址,url地址,一边重复
elementFormDefault="qualified">                              //元素质量

             

                 步骤:

                          (1)看xml中有多少个元素

                                         <element>

                            (2)看简单元素和复合元素

                                        **复杂元素

<element name="person">
  <complexType>
    <sequence>
       子元素
    </sequence>
  </complexType>
</element>
                            (3)简单元素写在复杂元素的里面

                                     

<element name="person">
<complexType>
<sequence>
      <element name="name" type="string"></element>
      <element name="age" type="int"></element>
</sequence>
</complexType>
</element>

                        (4)在被约束文件(xml文件)里面引入约束文件

                                

<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         //表示xnl是被约束文件
xmlns="http://www.example.org/1"                                     //是约束文档里面targetNamespace
xsi:schemaLocation="http://www.example.org/1 1.xsd"                  //targetNameSpace+空格+约束文件路径
>
   

                         ***<sequence>:表示元素出现的顺序

                         ***<all>:表示元素只能出现一次

                         ***<chioce>:元素只能出现其中的一个如name或则age

                         ***maxOccurs="unbounded":表示元素可以出现无数次

                         ***<any></any>:表示任意元素

                         ***可以约束属性

                                   ***写在复杂元素里面

                                    ***写在</complexType>之前

<attribute name="id1" type="int" use="required"></attribute>
</complexType>

                                        -- name:属性名称

                                        -- type:属性类型

                                        -- use:熟悉是否必须出现 required必须出现


           *******引入多个schema文件,可以给schema文件起个别名

           *******如果使用department的约束,使用department的别名即<dept:name></dept:name>

3.sax解析的原理

           ****解析xml有两种技术dom和sax

          ****根据xml的层级结构在内存中分配一个树形结构

          *****把xml中的标签,属性,文本封装成对象

          ****sax方式:事件驱动,边读边解析

           ****在javax.xml.parsers包里面

                            ****SAXParser

                                           此类的实例可以从SAXParserFactory.newSAXParser()方法获得

                                                   ***两个参数

                                                   ***第一个参数,xml的路径

                                                    ***事件处理器

                              ****SAXParserFactory

                                                     实例newInstance()方法得到


            *****当解析到开始标签的时候,自动执行startElement方法

            *****当解析到文本时候,自动执行character方法

            *****当解析到结束标签时候,自动执行endElement方法

4.使用jaxp的sax方式解析xml

                        ***sax的方式不能做增删改的操作,只能查询

                        ***打印出整个文档

                        ****执行Parser方法,第一个参数是xml的路径,第二个参数是事件处理器

                                               ***创建一个类,继承事件驱动的类

                                               ****重写里面的三个方法

                        *****获取所有的name元素的值

                                                ***定义一个成员变量flag=false;

                                                ***判断开始的方法是否是name元素,如果是name元素,把flag设置为true

                                                ****如果falg的值是true,在characters方法里面打印内容

                                                 ****当执行到结束的方法时候,把flag值设置成false

//打印p1.xml的内容
class MyDefault1 extends DefaultHandler{
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print("<"+qName+">");
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print(new String(ch,start,length));
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print("</"+qName+">");
	}	
}

public class TestSax {
     public static void main(String[] args) throws Exception, Exception {
		/**1.创建解析器工厂
		 * 2.创建解析器
		 * 3.执行parse方法
		 * 
		 * 4.自己创建一个类,继承DefaultHandler
		 * 5.重写里面的方法
		 * */
    	 //创建解析器工厂
    	 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
    	 //创建解析器
    	 SAXParser saxParser = saxParserFactory.newSAXParser();
    	 //执行parse方法
    	 saxParser.parse("src/p1.xml", new MyDefault1());
	}
}

                                     ****获取第一个name元素的值

                                               ****定义一个成员变量index=1

                                               ***在结束方法的时候,index+1

                                              ****想要打印出第一个name元素的值

                                                            ---在characters方法里面判断

                                                            ---判断flag=true&&index==1,再打印内容

public class TestSax {
     public static void main(String[] args) throws Exception, Exception {
		/**1.创建解析器工厂
		 * 2.创建解析器
		 * 3.执行parse方法
		 * 
		 * 4.自己创建一个类,继承DefaultHandler
		 * 5.重写里面的方法
		 * */
    	 //创建解析器工厂
    	 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
    	 //创建解析器
    	 SAXParser saxParser = saxParserFactory.newSAXParser();
    	 //执行parse方法
    	 saxParser.parse("src/p1.xml", new MyDefault2());
	}
}
//打印name标签的值
class MyDefault2 extends DefaultHandler{
	Boolean flag=false;
	int index=1;
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		//判断qName是否是name元素
		if("name".equals(qName)) {
			flag=true;
		}
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		//当flag的值是true的时候,表示解析到name元素
		if(flag==true&&index ==1) {
			System.out.println(new String(ch,start,length));
		}
	}

5.使用dom4j解析xml

                    ****dom4j:是一个组织,针对xml解析,提供dom4j解析

                    ****dom4j不是javase的一部分,想要使用第一步需要

                                         -----导入dom4j的jar包

                                         ----创建lib文件夹,把jar包放到lib中去,然后add to buildPath

                     ****得到document

                                   SAXReader saxReader=new SAXReader ()

                                  Document document=saxReader.read();

                  ****docuemnt的父接口是Node

                                   ***在docuemnt中找不到的方法在Node中寻找

                  ****document里面的方法  getRootElement():获取根节点,返回Element

                 ****Element也是一个接口,父接口是Node

                                    ---Element和Node里面方法

                                    ***getParent():获取父节点

                                    ***addElement():添加标签

6.使用dom4j查询xml 

                 ***dom4j是从上到下解析

                ****查询所有name元素里面的值

                             1.创建解析器

                             2.得到document

                             3.得到根节点

                              4.得到所有p1的标签

                                           --element(qname)

                                                   ***表示获取标签下面的第一个子标签

                                                   ***qname:标签的名称

                                            --elements(qname)

                                                   ***获取标签下面是这个名称的所有子标签(一层)

                                                    ***qname名称

                                             --elements()

                                                     ***获取标签下面的所有的子标签(一层)

                              5.得到name

                              6.得到name里面的值

	public static void selectName() throws DocumentException {
		/*
		 * 1.创建解析器
		 * 2.得到docuemnt
		 * 3.得到根节点
		 * 4.得到p1
		 * 5.得到p1下面的name
		 * 6.得到name里面的值
		 * */
		//创建解析器
		SAXReader reader=new SAXReader();
		//得到docuemnt
		Document document=reader.read("src/p1.xml");
		//得到根节点
		Element root = document.getRootElement();
		//得到p1
		List<Element> list = root.elements("p1");
		   //遍历list
		   for (Element element : list) {
			//得到p1下面的name值
			   Element name1 = element.element("name");
			   //得到name中的内容
			   String text = name1.getText();
			   System.out.println(text);
		}
	}

                          ***查询第一个name元素的值

                                      /*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点

* 4.得到第一个p1元素

                              element("name")

* 5.得到p1下面的name
* 6.得到name里面的值
* */
public static void selectSingleName() throws Exception {
		/*
		 * 1.创建解析器
		 * 2.得到docuemnt
		 * 3.得到根节点
		 * 4.得到第一个p1的元素
		 * 5.得到第一个p1下面的name元素
		 * 6.得到name的值
		 * */
		//* 1.创建解析器
		 //* 2.得到docuemnt
		 //* 3.得到根节点
		SAXReader reader=new SAXReader();
		Document document = reader.read("src/p1.xml");
		Element root = document.getRootElement();
		//得到第一个p1的元素
		Element p1 = root.element("p1");
		//得到第一个p1下面的name元素
		Element name = p1.element("name");
		//得到name的值
		String text = name.getText();
		System.out.println(text);
		
	}

                                  ****获取第二个name元素的值

                  /*
* 1.创建解析器
* 2.得到docuemnt
* 3.得到根节点
* 4.得到所有的p1
* 5.遍历得到第二个p1
* 6.得到第二个p1下面的name
* 7.得到name的值
* */

	public static void selectSecondName() throws Exception {
		/*
		 * 1.创建解析器
		 * 2.得到docuemnt
		 * 3.得到根节点
		 * 4.得到所有的p1
		 * 5.遍历得到第二个p1
		 * 6.得到第二个p1下面的name
		 * 7.得到name的值
		 * */
		//创建解析器
		SAXReader reader=new SAXReader();
		//得到docuemnt
		Document document = reader.read("src/p1.xml");
		//得到根节点
		Element root = document.getRootElement();
		//得到所有的p1
		List<Element> list = root.elements();
		//遍历得到第二个p1  list集合下标是从0开始的
		Element p2 = list.get(1);
		//得到第二个p1下面的name
		Element name2 = p2.element("name");
		//得到name的值
		String text = name2.getText();
		System.out.println(text);
	}

7.使用dom4j实现添加操作

            *****在第一个p1的末尾添加一个元素<sex>nv</sex>

    //添加元素
	public static void addSex() throws Exception {
		/*
		 * 1.创建解析器
		 * 2.得到docuemnt
		 * 3.得到根节点
		 * 4.获取到第一个p1
		 * 5.在p1下面添加sex
		 * 6.在添加完成的sex下面添加文本
		 * 7.回写xml操作
		 * */
		//创建解析器
	  SAXReader reader=new SAXReader();
	  //得到docuemnt
	  Document document = reader.read("src/p1.xml");
	  //得到根节点
	  Element root = document.getRootElement();
	  //获取到第一个p1
	  Element p1 = root.element("p1");
	  //在p1下面添加sex元素
	  Element sex1 = p1.addElement("sex");
	  //在添加完成的sex下面添加文本
	  sex1.addText("女");
	  //回写xml操作
	  OutputFormat outputFormat=OutputFormat.createPrettyPrint();
	  XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"), outputFormat);
	  xmlWriter.write(document);
	  xmlWriter.close();
	}

             ****回写操作

                     1.格式化   

                     2.new一个XMLWrite类   第一个参数是xml的文件路径,第二个参数是格式话的值

                      3.写入操作注意docuemnt没有“”

                      4.关闭流操作

6.在特定的位置添加元素

              ****在第一个p1下面的age标签之前添加<school>zzu.edu.cn</school>

	//在age之前添加元素
	public static void addAgeBefor() throws Exception {
		/*
		 * 1.创建解析器
		 * 2.得到docuemnt
		 * 3.得到根节点
		 * 4.获取到第一个p1
		 * 
		 * 5.获取p1下面的所有元素
		 *      需要创建一个school标签
		 *      elements();返回的list集合
		 *      使用list里面的方法,在特定的元素添加方法
		 *      add(index,E element)  index是下标,element是元素
		 * 6.回写xml
		 * 
		 * */
		//创建解析器
		SAXReader reader=new SAXReader();
		//得到docuemnt
		Document document = reader.read("src/p1.xml");
		//得到根节点
		Element root = document.getRootElement();
		//获取到第一个p1
		Element p1 = root.element("p1");
		//获取p1下面的所有元素
		List<Element> list = p1.elements();
		//创建school标签
		Element school = DocumentHelper.createElement("school");
		//在school下面创建文本
		school.addText("zzu.edu.cn");
		list.add(1, school);
		//回写xml
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

9使用dom4j实现修改节点的操作

              ****修改第一个p1下面的age元素的值

public class Dom4jUtils {          //封装操作
    public static String path="src/p1.xml";
	// 返回document封装
	public static Document getDocument(String path) throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read(path);
		return document;

	}
	//封装回写操作
	public static void xmlWriters(String path,Document document) throws Exception, FileNotFoundException {
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileOutputStream(path), format);
	    xmlWriter.write(document);
	    xmlWriter.close();
	public static void modifyAge() throws Exception {
		/*1.得到document
		 * 2.得到第一个p1元素
		 * 3.得到p1下面的age
		 * 4.修改age的值
		 * 5.回写xml
		 * */
		Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		Element age = p1.element("age");
		//修改age的值
		age.setText("30");
		//回写xml
		Dom4jUtils.xmlWriters(Dom4jUtils.path, document);
	}

10.使用dom4j删除节点操作

	//删除节点操作
	public static void delete() throws Exception{
		/*1.得到document
		 * 2.得到根节点
		 * 3.得到第一个p1标签
		 * 4.得到p1下面的school标签
		 * 5.删除(使用p1来删除school标签)
		 * 6.回写xml
		 * */
		Document document = Dom4jUtils.getDocument(Dom4jUtils.path);    //看上面的封装类
		Element root = document.getRootElement();
		//得到第一个p1标签
		Element p1 = root.element("p1");
		//得到p1下面的school标签
		Element school = p1.element("school");
		//删除(使用p1来删除school标签)
		//school.getParent();//获取到school的父节点p1
		p1.remove(school);
		//回写xml
		Dom4jUtils.xmlWriters(Dom4jUtils.path, document);                //看上面的封装类
	}
                        *****父节点调用remove()方法来删除子节点

 11.使用dom4j获取属性的操作

	//获取p1中的属性id1的值
     public static void getId() throws Exception {
    	 /*1.获取document
    	  * 2.得到根节点
    	  * 3.得到第一个p1
    	  * 4.得到p1的属性值
    	  * 注意查询不需要回写
    	  * */
    	 //获取document
    	 Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
    	 //得到根节点
    	 Element root = document.getRootElement();
    	 //得到第一个p1
    	 Element p1 = root.element("p1");
    	 //得到p1的属性值
    	 String  value = p1.attributeValue("id1");
         System.out.println(value);
     }

             *****注意:实现查询操作不需要回写xml

                               查询属性使用attributevalue

12.使用dom4j支持xpath的操作

                          *****可以直接获取元素

                           *****第一种形式

                                  /AAA/DDD/BBB:表示一层一层的,AAA下面DDD下面的BBB

                           ****第二种形式

                                 //BBB:表示得到所有的BBB

                            ****第三种形式

                                /*:表示所有的形式

                           ****第四种形式

                                  ***BBB[1]:表示第一个BBB元素

                                  ***BBB[last()]:表示最后一个BBB元素

                           *****第五种形式

                                 **//BBB[@id]:表示id中有属性就给得到

                           *****第六种形式

                               **//BBB[@id='b1']:表示元素名称是BBB,在BBB上面有id的属性,并且属性值是b1

13.使用dom4j支持xpath具体操作

                             ****默认的情况下,dom4j不支持xpath

                             *****如果想要在dom4j中使用xpath

                                        ***第一步导入jar包

                             ****在dom4j里面提供了两个方法,用来支持xpath

                                          ----selectNodes("xpath表达式"):获取多个节点

                                          ----selectsingleNode(“xpath表达式”):获取单一节点

                            *****查询p1.xml中所有name元素的值

                                        ---//name:属于name元素的表示

                                        ---selectNodes():得到多个name的值

	//查询p1.xml中所有name元素的值
    public static void test1() throws Exception {
    	/*1.得到document
    	 * 2.查询selectNodes(“//name”)方法得到所有name元素
    	 * */
    	//得到document
    	Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
    	//查询selectNodes(“//name”)方法得到所有name元素
    	List<Node> list = document.selectNodes("//name");
    	//遍历list集合
             for (Node node : list) {
				 String text = node.getText();
				 System.out.println(text);
			}
    }

                            ****使用xpath实现:获取第一个p1下面的name的值

                                             ---//p1[@id1='aaaa']/name

    public static void test2() throws Exception{
    	/*1.得到document
    	 * 2.直接使用selectSingleNode方法实现
    	 *        xpath://p1[@id1='aaa']/name
    	 * */
    	//得到document
    	Document document = Dom4jUtils.getDocument(Dom4jUtils.path);
        //直接使用selectSingleNode方法实现
    	Node name = document.selectSingleNode("//p1[@id1='aaa']/name");
        String text = name.getText();
        System.out.println(text);
    }

14.实现简单得到学生管理系统

                        ****使用xml当作数据库,存储学生信息

                        ***创建xml文件,写一些学生信息

                         ***增加操作

                                   /*1.创建解析器
* 2.得到docuemnt
* 3.获取到根节点
* 4.在根节点上面获取到stu标签

* 5.在stu上面依次添加id,name,age

                              ***addElement()

* 6.在id,name,age上添加值

                             ****setText()

* 7.回写xml

* **/

                           

    //增加
	public static void addStu(Student student) throws Exception {
		/*1.创建解析器
		 * 2.得到docuemnt
		 * 3.获取到根节点
		 * 4.在根节点上面获取到stu标签
		 * 5.在stu上面依次添加id,name,age
		 * 6.在id,name,age上添加值
		 * 7.回写xml
		 * **/
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到docuemnt
		Document document = saxReader.read("src/student.xml");
		//获取到根节点
		Element root = document.getRootElement();
		//在根节点上面获取到stu标签
		Element stu = root.addElement("stu");
		//在stu上面依次添加id,name,age
		Element id1 = stu.addElement("id");
		Element name1 = stu.addElement("name");
		Element age1 = stu.addElement("age");
		//在id,name,age上添加值
		id1.setText(student.getId());
		name1.setText(student.getName());
		age1.setText(student.getAge());
		//回写xml
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileWriter("src/student.xml") , format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

                            *****删除操作

              /*1.创建解析器
  * 2.得到document
  * 
  * 3.获取到所有的id
  *      //id
  * 4.遍历list集合
  * 5.判断集合中的id和传进来的id是否相同
  * 6.如果相同删除该id的父节点stu
  * */

//删除(根据学生的id删除)
	public static void delStu(String id) throws Exception {
		 /*1.创建解析器
		  * 2.得到document
		  * 
		  * 3.获取到所有的id
		  *      //id
		  * 4.遍历list集合
		  * 5.判断集合中的id和传进来的id是否相同
		  * 6.如果相同删除该id的父节点stu
		  * */
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document = saxReader.read("src/student.xml");
		//获取到所有的id
		List<Node> list = document.selectNodes("//id");
		//遍历
		for (Node node : list) {
			//得到id的值
			String idv = node.getText();
			//判断id是否相同
			if(idv.equals(id)) {
				Element stu = node.getParent();
				//得到stu的父节点
				Element student = stu.getParent();
				//删除stu
				student.remove(stu);
			}
			//回写xml
			OutputFormat format=OutputFormat.createPrettyPrint();
			XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/student.xml"), format);
			xmlWriter.write(document);
			xmlWriter.close();
			
		}
	}

                           ****查询操作

                   /*1.创建解析器
* 2.得到document
* 3.获取到所有id
* 4.返回id的集合,遍历list集合
* 5.得到每个id的节点
* 6.id节点的值
* 7.判断id的值和传递id的值是否相同
* 8.如果相同先获取到id的父节点stu
* 9.通过stu获取到name和age的值
* **/

	//查询(根据id查询学生信息)
	public static Student selectStu(String id) throws Exception {
		/*1.创建解析器
		 * 2.得到document
		 * 3.获取到所有id
		 * 4.返回id的集合,遍历list集合
		 * 5.得到每个id的节点
		 * 6.id节点的值
		 * 7.判断id的值和传递id的值是否相同
		 * 8.如果相同先获取到id的父节点stu
		 * 9.通过stu获取到name和age的值
		 * **/
		//创建student对象
		Student student=new Student();
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document = saxReader.read("src/student.xml");
		//获取到所有id
		List<Node> list = document.selectNodes("//id");
		//得到每个id的节点
		for (Node node : list) {  //node是每个id的节点
	    String idv = node.getText();
	    if(idv.equals(id)) {
	    	//得到id的父节点stu
	    	Element stu = node.getParent();
	    	//通过stu获取name和age的值
	    	String namev = stu.element("name").getText();
	    	String agev = stu.element("age").getText();
	    	student.setId(id);
	    	student.setName(namev);
	    	student.setAge(agev);
	    }
}
				
		return student;
	}

--------------------------------全部代码如下--------------------------------

-----student.xml文件-------

<?xml version="1.0" encoding="UTF-8"?>

<student> 
  <stu> 
    <id>100</id>  
    <name>zhangsan</name>  
    <age>20</age> 
  </stu>  
  <stu> 
    <id>101</id>  
    <name>lisi</name>  
    <age>30</age> 
  </stu> 
</student>
------student实体类---------
package cn.itcast.vo;

public class Student {
	private String id;
	private String name;
	private String age;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

-------实际的逻辑处理StuService类---------

package cn.itcast.service;

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.List;


import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import cn.itcast.vo.Student;

public class StuService {
    //增加
	public static void addStu(Student student) throws Exception {
		/*1.创建解析器
		 * 2.得到docuemnt
		 * 3.获取到根节点
		 * 4.在根节点上面获取到stu标签
		 * 5.在stu上面依次添加id,name,age
		 * 6.在id,name,age上添加值
		 * 7.回写xml
		 * **/
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到docuemnt
		Document document = saxReader.read("src/student.xml");
		//获取到根节点
		Element root = document.getRootElement();
		//在根节点上面获取到stu标签
		Element stu = root.addElement("stu");
		//在stu上面依次添加id,name,age
		Element id1 = stu.addElement("id");
		Element name1 = stu.addElement("name");
		Element age1 = stu.addElement("age");
		//在id,name,age上添加值
		id1.setText(student.getId());
		name1.setText(student.getName());
		age1.setText(student.getAge());
		//回写xml
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter=new XMLWriter(new FileWriter("src/student.xml") , format);
		xmlWriter.write(document);
		xmlWriter.close();
	}
	//删除(根据学生的id删除)
	public static void delStu(String id) throws Exception {
		 /*1.创建解析器
		  * 2.得到document
		  * 
		  * 3.获取到所有的id
		  *      //id
		  * 4.遍历list集合
		  * 5.判断集合中的id和传进来的id是否相同
		  * 6.如果相同删除该id的父节点stu
		  * */
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document = saxReader.read("src/student.xml");
		//获取到所有的id
		List<Node> list = document.selectNodes("//id");
		//遍历
		for (Node node : list) {
			//得到id的值
			String idv = node.getText();
			//判断id是否相同
			if(idv.equals(id)) {
				Element stu = node.getParent();
				//得到stu的父节点
				Element student = stu.getParent();
				//删除stu
				student.remove(stu);
			}
			//回写xml
			OutputFormat format=OutputFormat.createPrettyPrint();
			XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/student.xml"), format);
			xmlWriter.write(document);
			xmlWriter.close();
			
		}
	}
	//查询(根据id查询学生信息)
	public static Student selectStu(String id) throws Exception {
		/*1.创建解析器
		 * 2.得到document
		 * 3.获取到所有id
		 * 4.返回id的集合,遍历list集合
		 * 5.得到每个id的节点
		 * 6.id节点的值
		 * 7.判断id的值和传递id的值是否相同
		 * 8.如果相同先获取到id的父节点stu
		 * 9.通过stu获取到name和age的值
		 * **/
		//创建student对象
		Student student=new Student();
		//创建解析器
		SAXReader saxReader=new SAXReader();
		//得到document
		Document document = saxReader.read("src/student.xml");
		//获取到所有id
		List<Node> list = document.selectNodes("//id");
		//得到每个id的节点
		for (Node node : list) {  //node是每个id的节点
	    String idv = node.getText();
	    if(idv.equals(id)) {
	    	//得到id的父节点stu
	    	Element stu = node.getParent();
	    	//通过stu获取name和age的值
	    	String namev = stu.element("name").getText();
	    	String agev = stu.element("age").getText();
	    	student.setId(id);
	    	student.setName(namev);
	    	student.setAge(agev);
	    }
}
				
		return student;
	}
}
----------------测试类TestStu------------
package cn.itcast.test;


import cn.itcast.service.StuService;
import cn.itcast.vo.Student;

public class TestStu {
    public static void main(String[] args) throws Exception {
    	//addTest();
    	//delTest();
    	seleTest();
		
	}
    //测试添加
    public static void addTest() throws Exception {
    	Student student=new Student();
    	student.setId("102");
    	student.setName("wangwu");
    	student.setAge("40");
    	StuService.addStu(student);
    	
    }
    //测试删除
    public static void delTest() throws Exception {
    	StuService.delStu("102");
    }
    //测试查询
    public static void seleTest() throws Exception {
    	Student student = StuService.selectStu("100");
    	System.out.println(student.toString());
    }
}




                   

                     


              


           


猜你喜欢

转载自blog.csdn.net/silence_hv/article/details/80516371