Day20190528:XML可扩展标记语言

格式良好的XML文档

  • 必须有XML声明语句
  • 必须有且仅有一个根元素
  • 标签大小写敏感
  • 属性值用双引号
  • 标签成对
  • 元素正确嵌套
  • 标签自定义,可以使用中文
  1. XML文件有多种解析方式:
  • DOM解析 (SUN公司内置)
  • SAX解析(安卓开发)
  • JDOM
  • DOM4J解析

XML技术的用途:

  • 充当显示数据(以XML充当显示层)
  • 存储数据(存储层)的功能
  • 以XML描述数据,并在联系服务器与系统及其他部分之间传递

dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在哪个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。

DOM4J解析XML,解析步骤

  1. SAXReader sax = new SAXReader();
  2. Document doc = sax.read(file.xml);
  3. Element root =doc.getRootElement();
  4. Iterator iterator = root.elementIterator();
  5. 遍历迭代器

 

###XML文档

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student id="1">
		<name>莱昂纳多</name>
		<age>54</age>
		<sex>男</sex>
	</student>
	<student id="2">
		<name>周星驰</name>
		<age>56</age>
		<sex>男</sex>
	</student>
	<student id="3">
		<name>冈本多绪</name>
		<age>28</age>
		<sex>女</sex>
	</student>
</students>

###查

package com.YL.xml01;

import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ReadXML {

	public static void main(String[] args) throws Exception {
		
		//创建解析器对象
		SAXReader reader = new SAXReader();
		//读取.xml文件,返回document文件
		Document document = reader.read("src/student.xml");
		//获取根节点
		Element root = document.getRootElement();
		//获取子节点,存入list集合中
		List<Element> childs = root.elements();
		//查询.xml中子节点个数
		System.out.println("子节点个数为:"+childs.size());
		
		//遍历子节点对象
		for(Element c:childs) {
			//获取每个元素的属性对象
			Attribute attribute = c.attribute("id");
			//获取属性对应的值
			String value = attribute.getText();
			System.out.println("id = " +value);
			//获取每个结点下子节点的集合
			List<Element> elements = c.elements();
			
			for(Element element:elements) {
				String name = element.getName();//获取标签
				String text = element.getText();//获取内容
				System.out.println(name+"--"+text);
			}
			System.out.println("=====================");			
		}
	}
}

 

 

###增

public class AddXml {

	public static void main(String[] args) throws Exception{
		//创建解析器对象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();

		//输入需要增加的信息
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入id:");
		String id = scan.next();
		System.out.println("请输入姓名:");
		String name = scan.next();
		System.out.println("请输入性别:");
		String sex = scan.next();
		System.out.println("请输入年龄:");
		String age = scan.next();

		//根节点下新增一个子节点
		Element stuElement = root.addElement("student");
		stuElement.addAttribute("id", String.valueOf(id));
		//创建name标签
		Element addName = stuElement.addElement("name");
		addName.setText(name);
		//创建age标签
		Element addAge = stuElement.addElement("age");
		addAge.setText(String.valueOf(age));
		//创建sex
		Element addSex = stuElement.addElement("sex");
		addSex.setText(sex);


		//保存-固定格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("GBK");
		XMLWriter writer = new XMLWriter(new FileWriter("src/student.xml"),format);
		writer.write(document);
		writer.close();

		System.out.println("新增成功!!!");


	}
}
请输入id:
4
请输入姓名:
人民的名义
请输入性别:
男
请输入年龄:
48
新增成功!!!
<?xml version="1.0" encoding="GBK"?>

<students> 
  <student id="1"> 
    <name>莱昂纳多</name>  
    <age>54</age>  
    <sex>男</sex> 
  </student>  
  <student id="2"> 
    <name>周星驰</name>  
    <age>56</age>  
    <sex>男</sex> 
  </student>  
  <student id="3"> 
    <name>冈本多绪</name>  
    <age>30</age>  
    <sex>女</sex> 
  </student>  
  <student id="4">
    <name>人民的名义</name>
    <age>48</age>
    <sex>男</sex>
  </student>
</students>

 

###删

public class DelXml {

	public static void main(String[] args) throws Exception{
		
		/**
		 * 根据id删除元素
		 */
		
		System.out.println("输入要删除的id号:");
		Scanner scan = new Scanner(System.in);
		int idNum = scan.nextInt();
		
		//创建解析器对象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();//获取根节点
		
		List<Element> list = root.elements();//取出根节点下的子节点
		
		//遍历找出id
		for (Element element : list) {
			Attribute attribute = element.attribute("id");
			String id = attribute.getText();
			if(String.valueOf(idNum).equals(id)) {
				root.remove(element);//父节点删除子节点
				System.out.println("删除成功!!!");
			}
			
		}
		//保存
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("GBK");
		XMLWriter writer = new XMLWriter(new FileWriter("src/student.xml"),format);
		writer.write(document);
		writer.close();
		
	}
}
输入要删除的id号:
4
删除成功!!!
<?xml version="1.0" encoding="GBK"?>

<students> 
  <student id="1"> 
    <name>莱昂纳多</name>  
    <age>54</age>  
    <sex>男</sex> 
  </student>  
  <student id="2"> 
    <name>周星驰</name>  
    <age>56</age>  
    <sex>男</sex> 
  <

 

###改

public class UpdataXml {

	public static void main(String[] args) throws Exception{
		/**
		 * 输入要修改元素的id,将其年龄加1
		 */
		//创建解析器对象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();

		//输入要更新的信息:id=1,age+1
		Scanner scan = new Scanner(System.in);
		System.out.println("输入要修改的元素的id:");
		int id = scan.nextInt();

		List<Element> list = root.elements();
		//遍历找到该元素
		for (Element element : list) {
			Attribute attribute = element.attribute("id");
			String value = attribute.getText();
			if(value.equals(String.valueOf(id))) {
				List<Element> list2 = element.elements();
				for (Element element2 : list2) {
					if("age".equals(element2.getName())) {
						String age = element2.getText();
						System.out.println("修改之前的年龄:"+age);
						element2.setText(String.valueOf(Integer.parseInt(age)+1));
						System.out.println("修改之后的年龄:"+element2.getText());
					}
				}
			}

		}

		//保存
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("GBK");
		XMLWriter writer = new XMLWriter(new FileWriter("src/student.xml"),format);
		writer.write(document);
		writer.close();
		System.out.println("更新成功!!!");


	}
}
输入要修改的元素的id:
2
修改之前的年龄:56
修改之后的年龄:57
更新成功!!!

 

###封装成对象

public class Student {
	private String id;
	private String name;
	private int age;
	private String sex;
	public Student() {
		super();
	}
	public Student(String id,String name, int age, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	
	/**
	 * @return id
	 */
	public String getId() {
		return id;
	}
	/**
	 * @param id 要设置的 id
	 */
	public void setId(String id) {
		this.id = id;
	}
	/**
	 * @return name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name 要设置的 name
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return age
	 */
	public int getAge() {
		return age;
	}
	/**
	 * @param age 要设置的 age
	 */
	public void setAge(int age) {
		this.age = age;
	}
	/**
	 * @return sex
	 */
	public String getSex() {
		return sex;
	}
	/**
	 * @param sex 要设置的 sex
	 */
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	
}
public class XmlPackage {

	public static void main(String[] args) throws Exception{
		List<Student> student = getStudent();
		System.out.println("编号"+"\t"+"姓名"+"\t"+"年龄"+"\t"+"性别");
		for (Student s : student) {
			System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getSex());
		}

	}
	public static List<Student> getStudent() throws Exception{

		List<Student> list = new ArrayList<>();

		//创建解析器对象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();

		//获取子节点,存入list集合中
		List<Element> childs = root.elements();

		//循环获取元素
		for(Element c:childs) {
			//新建一个学生对象
			Student student = new Student();
			//获取每个元素的属性对象
			Attribute attribute = c.attribute("id");
			//获取属性对应的值
			String value = attribute.getText();
			student.setId(value);
			List<Element> elements = c.elements();

			for(Element element:elements) {
				String nodeName = element.getName();//获取标签
				String nodeValue = element.getText();//获取内容
				if("name".equals(nodeName)) {
					student.setName(nodeValue);
				}
				if("age".equals(nodeName)) {
					student.setAge(Integer.parseInt(nodeValue));
				}
				if("sex".equals(nodeName)) {
					student.setSex(nodeValue);
				}
			}
			list.add(student);
		}
		return list;
	}
}
编号	   姓名	        年龄	    性别
1	  莱昂纳多	54	    男
2	  周星驰  	57	    男
3	  冈本多绪	30	    女

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章