准备工作
1、员工工具类
class Emp { private int id; private String name; private int age; private String gender; private int salary; public Emp(){ } public Emp(int id, String name, int age, String gender, int salary) { super(); this.id = id; this.name = name; this.age = age; this.gender = gender; this.salary = salary; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public String toString() { return id+", "+name+", "+age+", "+gender+", "+salary; } }2、需要导入的包
dom4j 支持xml的生成和解析
jaxen 支持在Document解析中使用xpath
生成xml文档步骤
1.创建Document对象,表示xml文档
2.向Document对象中添加元素
3.按照预定的格式向根元素中添加子元素最终形成既定格式
4.创建XmlWriter
5.通过XMLWriter写出Document
//使用DOM生成xml文档 public static void writeXML() throws IOException{ List<Emp> empList = new ArrayList<Emp>(); empList.add(new Emp(1, "张三", 25, "男", 4000)); empList.add(new Emp(2, "李四", 26, "女", 5000)); empList.add(new Emp(3, "王五", 27, "男", 6000)); empList.add(new Emp(4, "赵六", 28, "女", 7000)); empList.add(new Emp(5, "钱七", 29, "男", 8000)); //第一步 Document doc = DocumentHelper.createDocument(); /* * 第二步 * Doucument提供了添加根元素的方法: * Element addElement(String name) * 向指定文档中添加指定名字的根元素,并以Element的实例形式将其返回,以便继续向根元素中做其他操作 * 需要注意的是,该方法只能调用一次。因为一个xml文档只能有一个根元素 */ Element root = doc.addElement("list"); //第三步 for(Emp emp : empList){ /* * 将每一个emp实例表示的员工信息以一个<emp>标签形式存入xml文档 * * Element提供了方法: * Element addElement(String name) * 向当前标签中添加给定名字的子标签,并以Element实例表示和返回 */ Element empEle = root.addElement("emp"); //添加name Element nameEle = empEle.addElement("name"); /* * Element提供了方法: * Element addText(String text) * 向当前标签中添加指定的文本信息 */ nameEle.addText(emp.getName()); //添加age Element ageEle = empEle.addElement("age"); ageEle.addText(emp.getAge()+""); //添加gender Element genderEle = empEle.addElement("gender"); genderEle.addText(emp.getGender()); //添加工资 Element salaryEle = empEle.addElement("salary"); salaryEle.addText(emp.getSalary()+""); /* * Element提供了添加属性的方法: * Element addAttribute(String name, String value) */ empEle.addAttribute("id", emp.getId()+""); } //第四步 XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint()); writer.setOutputStream(new FileOutputStream("myemp.xml")); //第五步 writer.write(doc); System.out.println("写出完毕!"); writer.close(); }
使用dom解析xml文档步骤
1.创建SAXReader2.使用SAXReader读取并解析xml文档解析后会返回一个Document的对象,该对象即表示解析的xml文档内容(这一步就是dom耗时耗资的地方了,因为会将xml文档全部读取完并载入内存)
3.通过Document获取根元素
4.根据文档结构从根元素开始逐级获取子元素,已达到遍历xml文档内容的目的
//使用dom解析xml文档 public static void parseXML() throws FileNotFoundException, DocumentException{ //第一步 SAXReader reader = new SAXReader(); //第二步 Document doc = reader.read(new FileInputStream("myemp.xml")); /* * 第三步 获取根元素 * Document提供了获取根元素的方法: * Element getRootElement() * * Element * 每一个Element实例都表示xml文档中的一个元素,即: * 一对标签通过Element实例,可以获取该实例表示的标签中的相关信息 * 例如该标签的名字标签的属性,以及该标签包含的所有子标签 */ Element root = doc.getRootElement(); /* * String getName() 获得标签名 */ System.out.println("根标签名为:"+root.getName()); /* * 第四步 * 解析xml文档内容,获取其中保存的所有员工信息 * 每个员工解析后可以使用Emp的一个实例保存 */ //该集合用来保存解析出来的所有员工信息 List<Emp> empList = new ArrayList<Emp>(); /** * Element提供了获取子标签的相关方法。常用的有: * * Element element(String name) 获取当前标签下指定名字的子标签(在子标签名字没有重复的时候常用) * * List elements() 获取当前表标签下所有子标签,返回的集合中是若干的Element实例,每一个实例表示其中一个子标签 * * List elements(String name) 获取当前标签下指定名字的所有子标签(在子标签名字有重复的时候使用) * * String getText() 获取当前标签中的文本 * * String getTextTrim() 在获取了标签中的文本之后,还会去除该字符串两端的空白 */ //获取跟标签中的所有子标签 List<Element> list = root.elements(); //遍历所有子标签,每一个就是一个emp标签 for(Element each : list){ //获取name的值 Element nameEle = each.element("name"); //获取<name>标签 String name = nameEle.getText(); //获取标签中的文本 //获取age值 int age = Integer.parseInt(each.elementText("age")); //获取gender String gender = each.elementText("gender"); //获取salary int salary = Integer.parseInt(each.elementText("salary")); /* * Attribute attribute(int index) * Attribute attribute(String name) * 获取当前标签中的属性 * * Attribute的每一个实例用于表示标签的一个属性 */ Attribute attr = each.attribute("id"); int id = Integer.parseInt(attr.getValue()); System.out.print(id+"\t"+name+"\t"+gender+"\t"+age+"\t"+salary); System.out.println(); Emp emp = new Emp(id, name, age, gender, salary); empList.add(emp); } System.out.println("解析完毕!"); System.out.println("得到了"+empList.size()+"个员工信息"); for(Emp emp1 : empList){ System.out.println(emp1); } }
使用xpath检索数据
//使用xpath检索xml数据 public static void useXpath(){ try { SAXReader reader = new SAXReader(); Document doc = reader.read(new FileInputStream("myemp.xml")); String xpath = "/list/emp[name ='王五']/gender"; List<Element> list = doc.selectNodes(xpath); for(Element e : list){ System.out.println(e.getText()); } } catch (Exception e) { e.getStackTrace(); } }