XML中的解析方式

1 篇文章 0 订阅
1 篇文章 0 订阅

XML解析

使用Java自带的DOM解析方式

public class XMLDemo {

	public static void main(String[] args) {
		// 使用java自带的DOM解析器来解析students.xml文件

		// 获取文档构建器工厂对象
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		try {
			// 通过工厂对象获取文档构建器
			DocumentBuilder builder = factory.newDocumentBuilder();

			// 解析xml文件,得到文档对象
			Document doc = builder.parse(new File("src/....xml"));

			// 通过文档对象获取xml的根元素节点
			Element root = doc.getDocumentElement();

			// 显示根元素
			show(root);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void show(Node element) {

		// 输出当前节点的信息
		short type = element.getNodeType();
		if (type == Node.ELEMENT_NODE) {
			System.out.print("元素:");
			System.out.println(element.getNodeName());

			// 获取该元素的属性列表
			NamedNodeMap map = element.getAttributes();
			for (int i = 0; i < map.getLength(); i++) {
				show(map.item(i));
			}

			// 检查该元素节点是否有子节点
			// 获取子节点
			NodeList list = element.getChildNodes();
			for (int i = 0; i < list.getLength(); i++) {
				show(list.item(i));
			}
		} else if (type == Node.ATTRIBUTE_NODE) {
			System.out.print("属性:");
			System.out.println(element.getNodeName() + "=" + element.getNodeValue());
		} else if (type == Node.TEXT_NODE) {
			String str = element.getNodeValue().trim();
			if (str.length() > 0) {
				System.out.print("文本:");
				System.out.println(str);
			}
		} else if (type == Node.COMMENT_NODE) {
			System.out.print("注释:");
			System.out.println(element.getNodeValue());
		}
	}
}

使用dom4j解析xml文档:

public class Dom4jDemo {
	public static void main(String[] args) {
		// 创建读取器对象
		SAXReader reader = new SAXReader();
		try {
			// 解析xml文件,得到文档对象
			Document doc = reader.read(new File("src/students.xml"));
			// 获取根元素节点
			Element root = doc.getRootElement();
			// 显示节点的内容
			show(root);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

	private static void show(Element element) {
		// 显示元素节点的信息
		System.out.println("元素:" + element.getName());
		// 元素的属性
		List<Attribute> attList = element.attributes();
		Attribute attr;
		for (int i = 0; i < attList.size(); i++) {
			attr = attList.get(i);
			System.out.println(attr.getName() + "=" + attr.getValue());
		}
		// 元素的文本内容
		String text = element.getText().trim();
		if (text.length() > 0) {
			System.out.println("元素的文本内容:" + element.getText());
		}
		// 子元素
		List<Element> eleList = element.elements();
		for (int i = 0; i < eleList.size(); i++) {
			show(eleList.get(i));
		}
	}
}

根据学生的学号查找xml中的学生信息,返回Student对象:

public class Dom4jDemo2 {

	public static void main(String[] args) {
		Student stu = findByStuId("s005");
		if (stu == null) {
			System.out.println("s005学号不存在!");
		} else {
			System.out.println(stu);
		}
	}

	/**
	 * 直接查找学号为s001的学生的信息,返回Student对象
	 * 
	 */
	public static Student findByStuId(String stuId) {

		Student stu = null;
		try {
			Document doc = new SAXReader().read(new File("src/students.xml"));

			List<Element> elements = doc.getRootElement().elements("student");
			Element ele;
			for (int i = 0; i < elements.size(); i++) {
				// student元素
				ele = elements.get(i);
				if (ele.attribute("id").getValue().equals(stuId)) {
					stu = new Student();
					stu.setName(ele.elements("name").get(0).getText());
					stu.setAge(Integer.parseInt(ele.elements("age").get(0).getText()));
					stu.setMobile(ele.elements("mobile").get(0).getText());
					stu.setAddress(ele.elements("address").get(0).getText());
					// 获取hobby元素的列表
					List<Element> hobbies = ele.elements("hobby");
					// 用来存放爱好字符串的列表
					List<String> list = new ArrayList<>();
					// 对hobby元素列表进行循环处理
					for (int j = 0; j < hobbies.size(); j++) {
						list.add(hobbies.get(j).getText());
					}
					// 将爱好列表放入学生对象中
					stu.setHobby(list);
					return stu;
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return null;
	}
}

创建新的xml文档:

public class Dom4jDemo3 {

	public static void main(String[] args) {
		// 生成保存员工信息的xml文档

		// 首先要获取文档对象
		Document doc = DocumentHelper.createDocument();
		// 添加xml注释
		doc.add(DocumentHelper.createComment("学习如何通过dom4j新建xml文档"));
		// 创建根元素节点对象
		Element employees = DocumentHelper.createElement("employees");

		// 给文档对象中设置根元素
		doc.setRootElement(employees);

		// 准备数据
		String[] ids = { "e01", "e02", "e03" };
		String[] names = { "张三", "李四", "王五" };
		String[] dobs = { "1999-09-08", "1999-12-14", "1987-12-20" };
		String[] genders = { "男", "女", "男" };
		String[] mobiles = { "13999999999", "13988888888", "13966666666" };

		// 使用循环来添加三个employee子元素
		for (int i = 0; i < 3; i++) {
			// 创建第一个employee元素
			Element empEle = DocumentHelper.createElement("employee");
			// 将ele设置为root的子元素
			employees.add(empEle);
			// 设置员工的属性
			addAttribute(empEle, "id", ids[i]);
			// 添加子元素
			addChildElement(empEle, "name", names[i]);
			addChildElement(empEle, "dob", dobs[i]);
			addChildElement(empEle, "gender", genders[i]);
			addChildElement(empEle, "mobile", mobiles[i]);
		}

		Writer writer = null;
		try {
			writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
			// 美观格式
			OutputFormat format = OutputFormat.createPrettyPrint();
			// 保存
			XMLWriter xmlWriter = new XMLWriter(writer, format);
			xmlWriter.write(doc);
			// 关闭书写器
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private static void addChildElement(Element parent, String eleName, String eleText) {
		Element ele = DocumentHelper.createElement(eleName);
		ele.setText(eleText);
		parent.add(ele);
	}

	private static void addAttribute(Element ele, String attrName, String attrValue) {
		ele.addAttribute(attrName, attrValue);
	}
}

 

给现有的employees.xml中添加新员工:

public class Dom4jDemo4 {

	public static void main(String[] args) {
		// 给现有的employees.xml中添加新员工

		Writer writer = null;
		// 创建读取器对象
		SAXReader reader = new SAXReader();
		try {
			Document doc = null;
			// 读取并解析现有的xml文件
			doc = reader.read(new File("employees.xml"));

			// 获取根元素employees节点
			Element employees = doc.getRootElement();

			// 创建新的元素对象,封装新员工的信息
			Element ele = DocumentHelper.createElement("employee");
			// 设置属性
			Utils.addAttribute(ele, "id", "e04");
			// 添加子元素
			Utils.addChildElement(ele, "name", "赵六");
			Utils.addChildElement(ele, "dob", "1988-08-08");
			Utils.addChildElement(ele, "gender", "女");
			Utils.addChildElement(ele, "mobile", "13955555555");

			// 将新元素添加到父元素的末尾
			employees.add(ele);

			// 保存
			writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
			XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
			xmlWriter.write(doc);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

将子元素添加到指定的位置:

  • 添加到首位。
public static void main(String[] args) {
		// 给现有的employees.xml中添加新员工,指定位置

		Writer writer = null;
		// 创建读取器对象
		SAXReader reader = new SAXReader();
		try {
			Document doc = null;
			// 读取并解析现有的xml文件
			doc = reader.read(new File("employees.xml"));

			// 获取根元素employees节点
			Element employees = doc.getRootElement();

			// 创建新的元素对象,封装新员工的信息
			Element ele = DocumentHelper.createElement("employee");
			// 设置属性
			Utils.addAttribute(ele, "id", "e05");
			// 添加子元素
			Utils.addChildElement(ele, "name", "刘华");
			Utils.addChildElement(ele, "dob", "1965-12-08");
			Utils.addChildElement(ele, "gender", "男");
			Utils.addChildElement(ele, "mobile", "13989898989");

			// 将新元素作为父元素的第一个子节点进行添加
			employees.elements("employee").add(0,ele);

			// 保存
			writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
			XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
			xmlWriter.write(doc);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

修改现有xml文档中的内容:

将id="e05"的员工的姓名改为张友。

public static void main(String[] args) {
		// 将id="e05"的员工的姓名改为张友。

		Writer writer = null;
		// 创建读取器对象
		SAXReader reader = new SAXReader();
		try {
			Document doc = null;
			// 读取并解析现有的xml文件
			doc = reader.read(new File("employees.xml"));

			// 获取根元素employees节点
			Element employees = doc.getRootElement();

			//获取员工employee元素列表
			List<Element> empList=employees.elements();
			//寻找id=e05的元素
			Element ele;
			for(int i=0;i<empList.size();i++) {
				ele=empList.get(i);
				//判断id属性的值是否为e05
				if(ele.attribute("id").getValue().equals("e05")) {
					//已经找到目标元素节点
					//修改子元素name的值
					ele.elements("name").get(0).setText("张友");
				}
			}

			// 保存
			writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
			XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
			xmlWriter.write(doc);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

删除现有xml文档中的元素节点:

  • 删除id=e05的员工。
public static void main(String[] args) {
		// 删除id=e05的员工。
		Writer writer = null;
		// 创建读取器对象
		SAXReader reader = new SAXReader();
		try {
			Document doc = null;
			// 读取并解析现有的xml文件
			doc = reader.read(new File("employees.xml"));

			// 获取根元素employees节点
			Element employees = doc.getRootElement();

			// 第一种方式,根据父节点中的方法进行删除,employees.remove(ele) //删除子元素节点
			// 第二种方式,通过子节点的列表进行删除
			// 获取员工employee元素列表
			List<Element> empList = employees.elements();

			// 寻找id=e05的元素
			Element ele;
			for (int i = 0; i < empList.size(); i++) {
				ele = empList.get(i);
				// 判断id属性的值是否为e05
				if (ele.attribute("id").getValue().equals("e05")) {
					// 已经找到目标元素节点
					empList.remove(ele);
					break;
				}
			}

			// 保存
			writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
			XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
			xmlWriter.write(doc);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值