XML语法和XML解析

XML用途

  • XML指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具
  • XML应用于web开发的许多方面,常用于简化数据的存储和共享。
  • XML简化数据共享
  • XML简化数据传输
  • XML简化平台的变更

XML读取与生成

存放员工信息的xml文件 emolist.xml

?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1">
        <name>张三丰</name>
        <age>22</age>
        <gender>男</gender>
        <salary>3000</salary>
    </emp>
    <emp id="2">
        <name>李四</name>
        <age>46</age>
        <gender>男</gender>
        <salary>10000</salary>
    </emp>
    <emp id="3">
        <name>王五</name>
        <age>21</age>
        <gender>女</gender>
        <salary>4500</salary>
    </emp>
    <emp id="4">
        <name>赵六</name>
        <age>23</age>
        <gender>女</gender>
        <salary>5000</salary>
    </emp>
    <emp id="5">
        <name>钱七</name>
        <age>35</age>
        <gender>男</gender>
        <salary>8000</salary>
    </emp>
    <emp id="6">
        <name>哈哈</name>
        <age>35</age>
        <gender>男</gender>
        <salary>8000</salary>
    </emp>
</list><?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1">
        <name>张三丰</name>
        <age>22</age>
        <gender>男</gender>
        <salary>3000</salary>
    </emp>
    <emp id="2">
        <name>李四</name>
        <age>46</age>
        <gender>男</gender>
        <salary>10000</salary>
    </emp>
    <emp id="3">
        <name>王五</name>
        <age>21</age>
        <gender>女</gender>
        <salary>4500</salary>
    </emp>
    <emp id="4">
        <name>赵六</name>
        <age>23</age>
        <gender>女</gender>
        <salary>5000</salary>
    </emp>
    <emp id="5">
        <name>钱七</name>
        <age>35</age>
        <gender>男</gender>
        <salary>8000</salary>
    </emp>
    <emp id="6">
        <name>哈哈</name>
        <age>35</age>
        <gender>男</gender>
        <salary>8000</salary>
    </emp>
</list>

用于存放员工信息的值对象 Emp.java

/**
 * 用来表示一个员工信息
 * 
 * VO value object值对象
 * 所谓指对象,就是当前的每个实例就是用来保存一组
 * 数据使用.
 * @author soft01
 *
 */
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;
    }

    @Override
    public String toString() {
        return id + ", " + name + ", " + age + "," + gender + "," + salary ;
    }
}

解析XML ParseXmlDemo.java

/**
 * 解析XML
 * @author soft01
 *
 */
public class ParseXmlDemo {
    public static void main(String[] args) {
        List<Emp> list = new ArrayList<Emp>();
        list.add(new Emp(1,"张三",22,"男",3000));
        list.add(new Emp(3,"李四",23,"女",4000));
        list.add(new Emp(4,"王五",23,"男",4000));
        list.add(new Emp(5,"赵六",25,"女",4000));
        /*
         * 原来我们程序使用的数据都是写在程序里的
         * 这样带来的问题是数据发送改变就会修改源代码
         * 这在实际开放中是极其不可取的!
         * 所以在实际开发中,我们通常的做法是程序
         * 与程序运行时需要的数据分离开,将数据保存
         * 到一个文件中,程序运行时通过读取文件中的
         * 数据来运行。这样将来数据有修改只需要在该
         * 文件中作出修改即可,程序无需做任何改动。
         * 
         * 将emplist.xml文件中的员工信息读出来存入
         * List集合。
         * 
         * 使用DOM解析XML的大致步骤
         * 1:创建SAXReader
         * 2:使用SAXReader读取XML文档并生成
         *  Document对象
         *  这一部就是DOM耗时耗资源的地方,因为要
         *  将XML文档全部读取完毕并以Document对象
         *  存入内存。
         * 3:通过Document获取根元素
         * 4:按照XML文档结构从根元素开始逐级开始获取子元素
         *  以达到获取XML文档数据的目的
         */
        try {
            //1
            SAXReader reader = new SAXReader();
            //2
//          reader.read(new File("emplist.xml"));
            Document doc = reader.read(new FileInputStream("emplist.xml"));
            System.out.println("读取文档完毕!");
            /*
             * 3获取根元素
             * Document提供的方法:
             * Element getRootElement()
             * 获取当前XML文档的根元素
             * org.dom4j下的Element的每一个实例
             * 用于表示XML文档中的一个元素(一对标签)
             */
            Element root = doc.getRootElement();
            /*
             * Element提供了获取当前元素信息的方法:
             * 常用:
             * 1:String getName()
             *  获取当前元素的名字
             * 2:String getText();
             *  获取当前元素中间的文本数据(开始
             *  标签与结束标签中间的文本内容)
             * 3:List elements()
             *  获取当前元素中的所有子元素
             * 5:Element element(String name)
             *   获取当前元素中指定名字的子元素
             * 6:String elementText(String name)
             *   获取当前元素中指定名字子元素中间的
             *   文本.
             *   String str = ele.elementText(name);
             *   效果等同于:
             *   String str = ele.element(name).getText();
             * 7:Attribute attribute(String name)
             *   获取当前元素中指定名字的属性
             * 8:String attributeValue(String name)
             *   获取当前元素中指定名字的属性的值
             */
            List<Element> emplist = root.elements();
            for(Element empEle : emplist) {
                //获取员工名字
                Element nameEle = empEle.element("name");
                String name = nameEle.getText();
                System.out.println(name);
                
                //获取年龄
                Element ageEle = empEle.element("age");
                int age = Integer.parseInt(ageEle.getText());
                System.out.println(age);
                
                //获取性别
                String gender = empEle.elementText("gender");
                System.out.println(gender);
                
                //获取工资
                int salary = Integer.parseInt(empEle.elementText("salary"));
                System.out.println(salary);
                
                //获取ID属性
                int id = Integer.parseInt(empEle.attributeValue("id"));
                System.out.println(id);
                
                Emp emp = new Emp(id,name,age,gender,salary);
                list.add(emp);
            }
            
            System.out.println("解析完毕!");
            list.forEach((e)->System.out.println(e));
            
//          for(Emp e : list) {
//              System.out.println(e);
//          }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
}

生成XML文档 WriterXMLDrmo.java

/**
 * 使用DOM生成XML文档
 * @author soft01
 *
 */
public class WriteXMLDemo {
    public static void main(String[] args) {
        List<Emp> list = new ArrayList<Emp>();
        list.add(new Emp(1,"张三",22,"男",3000));
        list.add(new Emp(2,"李四",23,"女",4000));
        list.add(new Emp(3,"王五",24,"男",5000));
        list.add(new Emp(4,"赵六",25,"女",6000));
        /*
         * 使用DOM生成一个XML文档的大致步骤:
         * 1:创建一个Document实例,表示一个空白文档
         * 2:向Document中添加根元素
         * 3:按照XML文档结构要求逐级添加子元素和数据
         *  以形成该结构
         * 4:创建XMLWriter
         * 5:使用XMLWriter将Document实例写出以形成
         *  xml文档
         */
        //1
        Document doc =DocumentHelper.createDocument();
        
        /*
         * 2 添加根元素
         * Document提供方法:
         * Element addElement(String name)
         * 向当前文档中添加根元素,并将该元素以Element实例
         * 返回,以便继续操作根元素。
         * 需要注意,该方法只能调用一次,因为一个XML文档中
         * 只允许有一个根元素。
         */
        Element root = doc.addElement("list");
        /*
         * Elemt也提供了相关的操作方法:
         * 
         * Element addElement(String name)
         * 向当前元素添加给定名字的子元素并返回
         * 
         * Element addText(String text)
         * 向当前元素中添加文本,添加到该开始标签与
         * 结束标签之间
         * 
         */
        for(Emp emp : list) {
            Element empEle = root.addElement(("emp"));
            //添加<name>
            Element nameEle = empEle.addElement("name");
            nameEle.addText(emp.getName());
            //添加<age>
            Element ageEle = empEle.addElement("age");
            ageEle.addText(emp.getAge()+"");
            //添加<gender>
            Element genderEle = empEle.addElement("gender");
            genderEle.addText(emp.getGender());
            //添加<salary>
            Element salaryEle = empEle.addElement("salary");
            salaryEle.addText(emp.getSalary()+"");
            //添加id属性
            empEle.addAttribute("id", emp.getId()+"");
        }
        
        XMLWriter writer = null;
        try {
            writer = new XMLWriter(new FileOutputStream("myemp.xml"),OutputFormat.createPrettyPrint());
            writer.write(doc);
            System.out.println("写成完毕!");
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            if(writer!=null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,213评论 25 707
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,260评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,651评论 18 399
  • 亲子日记第二十五天,上午送孩子们去上学,幼儿园老师让给孩子买两本关于声音的绘本,我这急性子耐不住了,起身就去...
    AA稳稳阅读 108评论 0 3
  • 想要的是一个可以一起玩耍行走说说话儿的伙伴 你不应该只是一个拿来暧昧和炫耀的对象称呼 亦或许 我们不需要一场形式的...
    _湫子阅读 234评论 0 0