XML相关操作

    xiaoxiao2021-03-26  26

    有一个Emp类,用于描述员工

    代码如下:

    /** * 该类用于描述emp.xml文件中的员工 */ public 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; } public String toString(){ return id+","+name+","+age+","+gender+","+salary; } }代码一: /** * 使用DOM解析XML文件 */ public class XMLDemo1 { public static void main(String[] args) { /** * 解析XML文件的基本流程 * 1.创建SAXReader用来读取XML文件 * 2.指定xml文件使得SAXReader读取,并解析成文档对象Document * 3.获取更元素 * 4.获取每一个元素,从而达到解析的目的 */ /** * 常用的读取方法 * Docment read(InputStream in) 字节流 * Docment read(Reader read) 字符流 * Docment read(File file) 文件对象 */ SAXReader reader = new SAXReader(); File fileXml = new File("emp.xml"); try { Document doc = reader.read(fileXml); Element root = doc.getRootElement(); /** * Element element(String name) * 获取当前标签下第一个名为给定名字的标签 * * List elements(String name) * 获取当前标签下所有给定名字的标签 * * List eleemnts() * 获取当前标签下所有的子标签 * * String elementText(Stirng name) * 获取当前标签中名为给定名字的子标签中间的文本 * * Attribute attribute(String name) * 获取当前标签中指定名字的属性 * * String getName() * 获取属性的名字 * * String getValue * 获取属性的值 * */ List<Emp> list = new ArrayList<Emp>(); List<Element> listXml = root.elements("emp"); for(Element emp : listXml){ Attribute att = emp.attribute("id"); int id = Integer.parseInt(att.getValue()); String name = emp.elementText("name"); int age = Integer.parseInt(emp.elementText("age")); String gender = emp.elementText("gender"); int salary = Integer.parseInt(emp.elementText("salary")); list.add(new Emp(id,name,age,gender,salary)); } System.out.println("解析了"+list.size()+"个员工信息"); //输出每个员工的信息 for(Emp e : list){ System.out.println(e); } } catch (DocumentException e) { e.printStackTrace(); } } }测试结果如下:

    解析了5个员工信息 1,张三,34,男,3000 2,李四,21,女,4000 3,王五,46,女,6500 4,赵六,28,男,4400 5,钱七,53,男,12000 ************************************************************************************************************************************* 代码二:

    /** * 使用DOM写出一个XML */ public class XMLDemo2 { public static void main(String[] args) { List<Emp> list = new ArrayList<Emp>(); list.add(new Emp(1,"jack",33,"男",5000)); list.add(new Emp(2,"boss",55,"男",5500)); list.add(new Emp(3,"marry",22,"女",3500)); list.add(new Emp(4,"kate",25,"女",6000)); list.add(new Emp(5,"tom",31,"男",8500)); /** * 生成一个XML文件的基本步骤 * 1.创建文档对象Document * 2.为Document添加根节点 * 3.为根节点组建树状结构 * 4.创建XMLWriter * 5.为XMLWriter指定写出目标 * 6.写出xml */ Document doc = DocumentHelper.createDocument(); /** * Document的方法 * Element addElement(String name) * 该方法用于向文档中添加给定名字的根元素,返回的Element实例就表示该根元素 * 需要注意的是,该方法只能调用一次,调用第二次会抛出异常 * * Element addElement(String name) * 向当前标签中添加给定名字的子标签 */ Element root = doc.addElement("list"); //循环添加每一个员工信息 for(Emp e : list){ Element emp = root.addElement("emp"); /** * Element addAttribute(String name,String value) * 为当前标签添加给定名字以及对应值的属性,返回值任然为当前标签 * 这样做的目的是可以连续添加若干属性 */ emp.addAttribute("id", String.valueOf(e.getId())); Element name = emp.addElement("name"); name.setText(e.getName());//addText()方法是在原有字符串后追加 emp.addElement("age").setText(String.valueOf(e.getAge())); emp.addElement("gender").addText(e.getGender()); emp.addElement("salary").addText(String.valueOf(e.getSalary())); } /** * 当退出循环后,那么Document中的结构就已经建完了,需要将其写出为xml */ XMLWriter writer = null; FileOutputStream out = null; try { writer = new XMLWriter( new FileOutputStream("myemp.xml"), OutputFormat.createPrettyPrint() ); /** * 将Document对象写出到文件中、这时会将Document转换为xml格式写入文件 */ writer.write(doc); } catch (Exception e1) { e1.printStackTrace(); } finally { if(writer != null){ try { writer.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } }测试结果如下:

    <?xml version="1.0" encoding="UTF-8"?> <list> <emp id="1"> <name>jack</name> <age>33</age> <gender>男</gender> <salary>5000</salary> </emp> <emp id="2"> <name>boss</name> <age>55</age> <gender>男</gender> <salary>5500</salary> </emp> <emp id="3"> <name>marry</name> <age>22</age> <gender>女</gender> <salary>3500</salary> </emp> <emp id="4"> <name>kate</name> <age>25</age> <gender>女</gender> <salary>6000</salary> </emp> <emp id="5"> <name>tom</name> <age>31</age> <gender>男</gender> <salary>8500</salary> </emp> </list>

    **************************************************************************************************************

    代码三:

    /** * DOM4J对XPatch的支持 */ public class XMLDemo3 { public static void main(String[] args) { SAXReader reader = new SAXReader(); try { Document doc = reader.read(new File("myemp.xml")) ; /** * List selectNodes(String xpath) * 根据给定的xpath查询对应的节点 */ // String path = "/list/emp[salary>5000]";//工资大于5000的人 // String path = "/list/emp[gender='女']/salary[.>4000]";//工资大于4000的女同志的工资 String path = "/list/emp[gender='女' and age>20]/salary";//女同志中年龄大于24岁的工资 List list = doc.selectNodes(path);//List不用添加泛型,因为xpath除了获取标签之外还有属性,根据获取的内容强转即可 for(Object o : list){ Element e = (Element) o; System.out.println(e.getText()); } } catch (DocumentException e) { e.printStackTrace(); } } }

    转载请注明原文地址: https://ju.6miu.com/read-659187.html

    最新回复(0)