SE02 Unit07 XML语法 、 XML解析

来源:互联网 发布:python bytes函数 编辑:程序博客网 时间:2024/06/09 17:49

emplist.xml

<?xml version="1.0" encoding="UTF-8"?><list>    <emp id="1">        <name>张三</name>        <age>34</age>        <gender></gender>        <salary>3000</salary>    </emp>    <emp id="2">        <name>李四</name>        <age>21</age>        <gender></gender>        <salary>4000</salary>    </emp>    <emp id="3">        <name>王五</name>        <age>46</age>        <gender></gender>        <salary>6500</salary>    </emp>    <emp id="4">        <name>赵六</name>        <age>28</age>        <gender></gender>        <salary>4400</salary>    </emp>    <emp id="5">        <name>钱七</name>        <age>53</age>        <gender></gender>        <salary>12000</salary>    </emp></list>

myemp.xml

<?xml version="1.0" encoding="UTF-8"?><list>  <emp id="1">    <name>张三</name>    <age>22</age>    <gender></gender>    <salary>5000</salary>  </emp>  <emp id="2">    <name>李四</name>    <age>23</age>    <gender></gender>    <salary>6000</salary>  </emp>  <emp id="3">    <name>王五</name>    <age>24</age>    <gender></gender>    <salary>7000</salary>  </emp>  <emp id="4">    <name>赵六</name>    <age>25</age>    <gender></gender>    <salary>8000</salary>  </emp>  <emp id="5">    <name>钱七</name>    <age>26</age>    <gender></gender>    <salary>9000</salary>  </emp></list>

用当前类的实例保存xml文档中的一个员工信息 (这个是用构造方法生成的)

package day12;/** * 用当前类的实例保存xml文档中的一个员工信息 * @author adminitartor * */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;    }}

使用DOM4J解析XML文档

package day12;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * 使用DOM4J解析XML文档 *  * 将emplist.xml文档中的所有员工信息解析出来 * 并存入到一个List集合保存 * @author adminitartor * */public class ParseXmlDemo {    public static void main(String[] args) {        /*         * 使用DOM4J解析XML的大致流程         * 1:创建SAXReader         * 2:使用SAXReader读取XML文档,并返回         *   一个Document对象。         *   这一步就是DOM解析XML耗时耗资源的地方         *   因为这一步就会将XML文档中所有内容解析         *   出来并以一个Document对象保存。由于对象         *   存于内存,所以文档内容大的话会相应消耗         *   资源。         * 3:从Document中获取根元素         * 4:根据XML文档结构从根元素中逐级获取子元         *   素,最终达到遍历XML文档数据的目的。           */        try {            //1            SAXReader reader = new SAXReader();            //2读取xml文档并返回Document对象//            reader.read(new File("emplist.xml"));            Document doc = reader.read(                new FileInputStream("emplist.xml")            );            System.out.println("读取xml文档完毕!");            /*             * 3 获取根元素             * Element的每一个实例用于表示XML文档             * 中的一个元素(一对标签)             *              * Element用于获取当前标签信息的相关方法:             *              * String getName()             * 获取当前标签的名字             *              * String getText()             * 获取当前标签中间的文本信息             *              * List elements()             * 获取当前标签下的所有子标签             *              * List elements(String name)             * 获取当前标签下所有同名子标签             *              * Element element(String name)             * 获取当前标签下指定名字的子标签             *              * String elementText(String name)             * 获取当前标签下指定名字的子标签中间的             * 文本。             * ele.elementText(name)             * 相当于调用了:             * ele.element(name).getText()             *              * Attribute attribute(String name)             * 获取当前标签下指定名字的属性             *              */            Element root = doc.getRootElement();            /*             * 该集合用于保存从xml文档中解析出来的             * 所有员工信息             */            List<Emp> empList = new ArrayList<Emp>();            //获取根标签<list>下面的所有子标签<emp>            List<Element> list = root.elements();            /*             * 遍历每一个员工标签<emp>,并将信息保存             * 到一个Emp对象上,然后存入empList集合             */            for(Element empEle : list){                //获取name                Element nameEle = empEle.element("name");                String name = nameEle.getText();//                System.out.println(name);                //获取age                int age = Integer.parseInt(                    empEle.elementText("age")                );                //gender                String gender = empEle.elementText("gender");                //salary                int salary = Integer.parseInt(                    empEle.elementText("salary")                    );                /*                 * Attribute的每一个实例用于表示某个标签                 * 中的一个属性。                 * 常用方法:                 * String getName()                 * 获取属性名                 *                  * String getValue()                 * 获取属性值                 */                Attribute attri = empEle.attribute("id");                int id = Integer.parseInt(                    attri.getValue()                );                Emp emp = new Emp(id, name, age, gender, salary);                empList.add(emp);            }            System.out.println("解析完毕!");            for(Emp emp : empList){                System.out.println(emp);            }        } catch (Exception e) {            e.printStackTrace();        }          }}

使用DOM4J生成XML文档

package day12;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;/** * 使用DOM4J生成XML文档 * @author adminitartor * */public class WriteXmlDemo {    public static void main(String[] args) {        /*         * 生成XML文档的大致步骤:         * 1:创建一个Document对象表示一个空白         *   文档         * 2:向Document中添加根元素         * 3:按照想生成的xml文档的结构顺序逐级的         *   向根元素中添加子元素以及对应的信息         * 4:创建XmlWriter对象         * 5:将Document对象写出以形成xml文档         * 6:关闭XmlWriter             */        try {            List<Emp> empList = new ArrayList<Emp>();            empList.add(new Emp(1,"张三",22,"男",5000));            empList.add(new Emp(2,"李四",23,"女",6000));            empList.add(new Emp(3,"王五",24,"男",7000));            empList.add(new Emp(4,"赵六",25,"女",8000));            empList.add(new Emp(5,"钱七",26,"男",9000));            //1 创建一个空白文档            Document doc = DocumentHelper.createDocument();            /*             * 2 向文档中添加根元素             * Element addElement(String name)             * 添加给定名字的根元素,并将该元素以Element             * 实例形式返回,以便于继续操作。             *              * 注意,该方法只能调用一次,因为一个文档只能有             * 一个根元素             *              */            Element root = doc.addElement("list");            /*             * 3 添加子标签以形成xml文档结构             * 将集合中的每个员工信息作为一个<emp>标签             * 添加到根标签中             */            for(Emp emp : empList){                /*                 * Element提供了添加相应信息的方法:                 *                  * Element addElement(String name)                 * 向当前标签中添加给定名字的子标签并将其                 * 返回。                 */                Element empEle = root.addElement("emp");                //向<emp>标签中添加<name>标签                Element nameEle = empEle.addElement("name");                //向<name>标签中添加文本信息                nameEle.addText(emp.getName());                empEle.addElement("age").addText(emp.getAge()+"");                empEle.addElement("gender").addText(emp.getGender());                empEle.addElement("salary").addText(emp.getSalary()+"");                /*                 * 向<emp>标签中添加属性"id"                 */                empEle.addAttribute("id", emp.getId()+"");                        }            //4            XMLWriter writer = new XMLWriter(                new FileOutputStream("myemp.xml"),                OutputFormat.createPrettyPrint()            );            writer.write(doc);            System.out.println("写出完毕!");            writer.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

使用XPath检索XML数据

package day12;import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * 使用XPath检索XML数据 * @author adminitartor * */public class XpathDemo {    public static void main(String[] args) {        try {            SAXReader reader = new SAXReader();            Document doc = reader.read(                new File("myemp.xml")            );            String path = "/list/emp[gender='女' and age>24]/salary";            List<Element> list = doc.selectNodes(path);            for(Element e : list){                System.out.println(e.getText());            }        } catch (Exception e) {            e.printStackTrace();        }    }}
原创粉丝点击